Jestem nowy w XSLT.
Mam XML-a
<root>
<fiberList>
<fiber>
<A>abcd</A>
<B>bcde</B>
<C>cdef</C>
</fiber>
</fiberList>
<generatorList>
<generator>
<D>defg</D>
<E>efgh</E>
</generator>
</root>
Chcę przekształcić ten XML w inny XML poprzez XSL. Wynikowy XML powinien być podobny do tego-
<parent>
<child>
<M>abcd</M>
<N>bcde</N>
<O>efgh</O>
</child>
</parent>
Ale otrzymuję następujący kod XML po transformacji
<parent>
<child>
<M>abcd</M>
<N>bcde</N>
<O/>
</child>
</parent>
Mój XSL jest następujący:
<xsl:template match="/">
<xsl:element name="parent">
<xsl:apply-templates select="root/fiberList/fiber"/>
</xsl:element>
</xsl:template>
<xsl:template match="root/fiberList/fiber">
<xsl:element name="child">
<xsl:element name="M">
<xsl:value-of select="A"/>
</element>
<xsl:element name="N">
<xsl:value-of select="B"/>
</element>
<xsl:element name="O">
<xsl:value-of select="root/generatorList/generator/E"/>
</element>
</element>
</template>
</stylesheet>
Proszę pomóż.
Odpowiedzi:
0 dla odpowiedzi № 1Nie próbowałem tego .. ale myślę brakuje wiodącego "/" tutaj:
<xsl:value-of select="root/generatorList/generator/E"/>
spróbuj tego proszę:
<xsl:value-of select="/root/generatorList/generator/E"/>
w przeciwnym razie silnik xslt próbuje znaleźć względną ścieżkę "root / generatorList / generator / E"począwszy od dopasowanych element (/ root / fiberList / fiber) szablonu, ale nie ma / root / fiberList / fiber / root / generatorList / generator / E.
0 dla odpowiedzi nr 2
Jako alternatywa możesz również użyć tego arkusza stylów:
XSLT-1.0:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes" method="xml"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/root">
<parent>
<child>
<xsl:apply-templates select="fiberList/fiber/A | fiberList/fiber/B | generatorList/generator/E"/>
</child>
</parent>
</xsl:template>
<xsl:template match="A">
<M>
<xsl:value-of select="."/>
</M>
</xsl:template>
<xsl:template match="B">
<N>
<xsl:value-of select="."/>
</N>
</xsl:template>
<xsl:template match="E">
<O>
<xsl:value-of select="."/>
</O>
</xsl:template>
</xsl:stylesheet>
EDYTOWAĆ:
W XSLT-2.0 możesz uprościć xsl:apply-templates
instrukcja do następujących czynności:
<xsl:apply-templates select="fiberList/fiber/(A | B) | generatorList/generator/E"/>