Günter: 2 XML Dokumente;

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

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

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