Chcę napisać transformację XSL, która wynika wiele wbudowanych arkuszy stylów wewnątrz elementów szablonu (kolekcja arkusza stylów jest przetwarzana poniżej przez inny komponent, który wyciąga wymagany i stosuje go). Więc co chcę produkować w wyniku transformacji, jest plik XML zawierający coś takiego:

Struktura pożądanego XML

    <?xml version="1.0"?>
<TEMPLATEDATA xmlns="http://www.sanjay.com/appname" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <TEMPLATE name="addFocus" operation="Add">
    <xsl:stylesheet version="1.0">
      <xsl:template match="/">
        <STRATEGICFOCUS />
      </xsl:template>
    </xsl:stylesheet>
  </TEMPLATE>

    
  <TEMPLATE name="addOrg" operation="Init">
    <xsl:stylesheet version="1.0"  xmlns:app="http://www.sanjay.com/myapp">
      <xsl:output method="xml" indent="yes"/>
      <xsl:param name="Name"></xsl:param>
      <xsl:template match="*">
          <CONTENT>
              <NAME><xsl:value-of select="$Name"/></NAME>
          </CONTENT>
      </xsl:template>
    </xsl:stylesheet>
  </TEMPLATE>
  
</TEMPLATEDATA>

Chcę wyprodukować to wyjście, definiując transformację XSL jak więc (ignoruj wejście XML, który przekształcam, ponieważ nie jest ważne):

pożądana transformacja

    <xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns="http://www.sanjay.com/myapp">

    <xsl:template match="/">
        <TEMPLATEDATA>
            <xsl:call-template name="template1" />
            <xsl:call-template name="template2" />
        </TEMPLATEDATA>
    </xsl:template>

    <xsl:template name="template1">
        <TEMPLATE name="addFocus" operation="Add">
            <xsl:stylesheet version="1.0">
                <xsl:template match="/">
                    <STRATEGICFOCUS />
                </xsl:template>
            </xsl:stylesheet>
        </TEMPLATE>
    </xsl:template>

    <xsl:template name="template2">
        <TEMPLATE name="addOrg" operation="Init"
            <xsl:stylesheet version="1.0"  xmlns:app="http://www.sanjay.com/myapp">
                <xsl:output method="xml" indent="yes"/>
                <xsl:param name="Name"></xsl:param>
                <xsl:template match="*">
                    <CONTENT>
                        <NAME>
                            <xsl:value-of select="$Name"/>
                        </NAME>
                    </CONTENT>
                </xsl:template>
            </xsl:stylesheet>
        </TEMPLATE>
    </xsl:template>
</xsl:stylesheet>

Dostaję błąd analiza XSL dla arkusza stylów mówiąc, że wewnętrzny XSL: arkusz stylów jest nieprawidłowy, ponieważ nie może być dzieckiem elementu szablonu. Czy ktoś może mi powiedzieć, co muszę zrobić, żeby to zrobić? Wiem, że prawdopodobnie mogę osadzić wewnętrzne arkusze stylów w sekcjach CDATA, ale wolałbym tego nie robić.

Sanjay.

0
Sanjay 13 październik 2020, 00:10

1 odpowiedź

Najlepsza odpowiedź

Wydaje się, że chcesz użyć przestrzeni nazw alias HTTPS: // www. w3.org/tr/xslt-30/#element-NoMespace-alias dla elementów wyników, np

 <xsl:namespace-alias stylesheet-prefix="axsl" result-prefix="xsl"/>

Z xmlns:axsl="http://www.w3.org/1999/XSL/Transform-alias" zadeklarowany i używany do np.

<xsl:template name="template1">
    <TEMPLATE name="addFocus" operation="Add">
        <axsl:stylesheet version="1.0">
            <axsl:template match="/">
                <STRATEGICFOCUS />
            </axsl:template>
        </xasl:stylesheet>
    </TEMPLATE>
</xsl:template>
0
Martin Honnen 12 październik 2020, 22:05