2 XML Dokumente;
Günter
- xsl
0 Thomas J.S.0 Günter
Hallo,
ich bastle schon seit Stunden an einem geeignetem pattern herum. Ihr seid meine letzte Hoffnung. Zum Problem:
ich habe zwei xml Dateien, die ich mit einer xsl-Datei zu einer dritten xml-Datei kombiniere.
die erste xml-Datei besitzt ein Element, dass ich mit einer Id in der zweiten xml-Datei vergleichen möchte. Nach dem Vergleich soll der Inhalt des Elements mit der identischen ID in meine dritte xml-Datei eingetragen werden.
erste xml-Datei:
<orders>
<order id="1">
<info>
...
</info>
<item>
...
<alt_sku>123</alt_sku>
</item>
<item>
...
<alt_sku>345</alt_sku>
</item>
<item>
...
<alt_sku>321</alt_sku>
</item>
...
</order>
<order id="2">...
</order>
zweite xml-Datei:
<items>
<item artno="123">item 123</item>
<item artno="321">item 321</item>
</items>
meine xsl-Datei:
<xsl:variable name="extItem" select="document('zweiteDatei.xml')"/>
<xsl:template match="/">
<orders>
<xsl:for-each select="//order">
<order>
<info>
<xsl:apply-templates select="info" />
</info>
<xsl:apply-templates select="item" />
</order>
</xsl:for-each>
</orders>
</xsl:template>
<xsl:template match="info">
...
</xsl:template>
<xsl:template match="item">
<item>
...
<alt_sku><xsl:value-of select="alt_sku" /></alt_sku>
<no>
<xsl:for-each select="(//orders/order/item[alt_sku=$zweiteDatei/items/item/@artno])">
<xsl:value-of select="(alt_sku)" />
<xsl:value-of select="($zweiteDatei/items/item/@artno)" />
</xsl:for-each>
</no>
</item>
</xsl:template>
die Output-Datei soll so aussehen:
...
<item>
...
<alt_sku>123</alt_sku>
<no>1item 123</no
</item>
...
<item>
...
<alt_sku>321</alt_sku>
<no>item 321</no>
</item>
Ich hoffe, dass das einigermaßen verständlich war.
Vielen Dank schon im voraus.
Günter
Hallo,
ich habe zwei xml Dateien, die ich mit einer xsl-Datei zu einer dritten xml-Datei kombiniere.
die erste xml-Datei besitzt ein Element, dass ich mit einer Id in der zweiten xml-Datei vergleichen möchte. Nach dem Vergleich soll der Inhalt des Elements mit der identischen ID in meine dritte xml-Datei eingetragen werden.
meine xsl-Datei:
<xsl:variable name="extItem" select="document('zweiteDatei.xml')"/><xsl:template match="/">
<orders>
<xsl:for-each select="//order">
<xsl:for-each select="orders/order">
(das "//order" ist "schlimm", weil wirklich unnötig)
<xsl:template match="item">
<no>
<xsl:for-each select="(//orders/order/item[alt_sku=$zweiteDatei/items/item/@artno])">
<xsl:value-of select="(alt_sku)" />
<xsl:value-of select="($zweiteDatei/items/item/@artno)" />
</xsl:for-each>
</no>
Abgesehen davon, dass $zweiteDatei eigentlich $extItem heissen soll, verstehe ich nicht was du hier machen möchtest. (* es sein denn du hast mehrere items (im 2. XML) die im @artno die ID ('alt_sku'??) eines items aus dem 1. XML haben)
Wenn "Nach dem Vergleich der Inhalt des Elements mit der identischen ID in meine dritte xml-Datei eingetragen werden soll", müsste das so aussehen:
<xsl:template match="item">
<xsl:variable name="altSku" select="alt_sku" />
...
<no>
<xsl:value-of select="$extItem/items/item[@artno = $altSku]" />
</no>
* dann sollte es so aussehen:
<xsl:template match="item">
<xsl:variable name="altSku" select="alt_sku" />
...
<xsl:for-each select="$extItem/items/item[@artno = $altSku]">
<no>
<xsl:value-of select="." />
</no>
</xsl:for-each>
Grüße
Thomas
Hallo,
»
<xsl:for-each select="orders/order">
(das "//order" ist "schlimm", weil wirklich unnötig)
ok.
...
Abgesehen davon, dass $zweiteDatei eigentlich $extItem heissen soll, verstehe ich nicht was du hier machen möchtest.
zum besseren Verständnis, hatte ich die Datei umbenannt und die Variabel vergessen.
(* es sein denn du hast mehrere items (im 2. XML) die im @artno die ID ('alt_sku'??) eines items aus dem 1. XML haben)
genau.
Besten Dank. Genau das war´s.
Viele Grüße
Günter