Kerstin: mehrere XML in einer XSL verarbeiten

Hallo,

ich habe hier zwei XML-Dateien

"cdcatalog_data.xml" mit den Daten
<catalog>
 <cd>
  <title>Empire Burlesque</title>
  <artist>Bob Dylan</artist>
  <country>USA</country>
  <company>Columbia</company>
  <price>10.90</price>
  <year>1985</year>
 </cd>
 <cd>
  <title>Hide your heart</title>
  <artist>Bonnie Tyler</artist>
  <country>UK</country>
  <company>CBS Records</company>
  <price>9.90</price>
  <year>1988</year>
 </cd>
</catalog>

und

"cdcatalog_book.xml" mit der Struktur - also wie am Ende die Daten angeordnet sein sollen

<html>
 <body>
  <h2>My CD Collection</h2>
   <table border="1">
    <tr bgcolor="#9acd32">
      <th align="left">Title</th>
      <th align="left">Artist</th>
    </tr>
    <cd_liste/>
  </table>
 </body>
</html>

Dazu gibt es ein cdcatalog.xsl, welches beim Aufruf zusammen mit cdcatalog.xml dieses verarbeitet:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method='html' version='1.0' encoding='UTF-8' indent='yes'/>

<xsl:template match="/">
  [1]<xsl:copy-of select="."/>
  xsl:apply-templates/
</xsl:template>

<xsl:template match="cd_liste">
 [2]<xsl:for-each select="document('cdcatalog_data.xml')/catalog/cd">
  <tr>
   <td><xsl:value-of select="title"/></td>
   <td><xsl:value-of select="artist"/></td>
  </tr>
  </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Bei [1] kopiert er alle vorhandenen Knoten. Die brauch ich auch, denn diese sollen ja erhalten bleiben. Unter [2] sollen nun die Daten aus cdcatalog_data.xml eingefügt werden. Allerdings ersetzten diese nicht  das Element <cd_liste/> in cdcatalog_book.xml, sondern werden einfach hinten dran angehangen, so dass so eine Ausgabe zu stande kommt:

<html>
 <body>
  <h2>My CD Collection</h2>
   <table border="1">
    <tr bgcolor="#9acd32">
      <th align="left">Title</th>
      <th align="left">Artist</th>
    </tr>
    <cd_liste></cd_liste>
   </table>
 </body>
</html>

My CD Collection

Title
        Artist

<tr>
<td>Empire Burlesque</td>
<td>Bob Dylan</td>
</tr><tr>
<td>Hide your heart</td>
<td>Bonnie Tyler</td>
</tr>

Die Frage ist, wie krieg ich die Daten an die richtige Stelle <cd_liste/> und kann die anderen Elemente drumrum mit ihrem Inhalt kopieren?

THX,
Gruß,
Kerstin

  1. Hallo,

    Die Frage ist, wie krieg ich die Daten an die richtige Stelle <cd_liste/> und kann die anderen Elemente drumrum mit ihrem Inhalt kopieren?

    -------------- XSL --------------------------
    <?xml version="1.0" encoding="iso-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:template match="/">
      <xsl:apply-templates />
     </xsl:template>
     <xsl:template match="*[name() != 'cd_liste']">
      xsl:copy
       <xsl:for-each select="@*">
        <xsl:copy />
       </xsl:for-each>
       <xsl:apply-templates />
      </xsl:copy>
     </xsl:template>
     <xsl:template match="cd_liste">
      <xsl:for-each select="document('kerstin2.xml')/catalog/cd">
       <tr>
        <td><xsl:value-of select="title"/></td>
        <td><xsl:value-of select="artist"/></td>
       </tr>
      </xsl:for-each>
     </xsl:template>
    </xsl:stylesheet>
    ------------------------------------------------
    (Dateinamen im document() Anpassen)

    Angewendet auf "cdcatalog_book.xml" produziert eine Ausgabe:

    <html>
    <body>
    <h2>My CD Collection</h2>
    <table border="1">
    <tr bgcolor="#9acd32">
    <th align="left">Title</th>
    <th align="left">Artist</th>
    </tr>
    <tr>
    <td>Empire Burlesque</td>
    <td>Bob Dylan</td>
    </tr>
    <tr>
    <td>Hide your heart</td>
    <td>Bonnie Tyler</td>
    </tr>
    </table>
    </body>
    </html>

    Grüße
    Thomas

    1. Na das is ja genial ... ich danke Dir

      Gruß,
      Kerstin