/ / Wybór danych w XSL z różnych sekcji XML - xml, xslt

Wybieranie danych w XSL z różnych sekcji XML - xml, xslt

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 № 1

Nie 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"/>