regenfeld: Zwei-Phasen-Transformation

Beitrag lesen

Grüssi,

Ausgangspunkt ist ein XML file, welches ich in ein HTML file transformieren möchte. Vor dieser HTML-Transformation möchte ich jedoch XML tags, die bestimmte Eigenschaften besitzen, in andere umwandeln.

Alle Artikel variieren in Beschreibung, Preis oder Lieferant, nur der Artikel "AllgemeinerStuhl" hat immer die gleichen Daten.

Die einfachste Möglichkeit wäre sicher die von Simon vorgeschlagene. Wenn du aber nicht die Stuhl-Daten fix ins stylesheet hard-codieren willst, sondern das xslt ev. für verschiedene xml-files verwenden willst, und nicht in jedem xml-file der AllgemeineStuhl die gleichen Daten hat, könntest du versuchen, die Daten einmal pro (xml)file zu definieren, und sie dann in der Artikelliste einfach zu referenzieren:

<StandardArtikel>
  <artikel name="AllgemeinerStuhl">
    <beschreibung>Beschreibung zu AllgemeinerStuhl</beschreibung>
    <preis>10</preis>
    <lieferant>XYZ</lieferant>
  </artikel>
</StandardArtikel>

im Template musst du eine Artikel-Referenz dann irgendwie von einem normalen Artikel unterscheiden können, beispielsweise dadurch dass das Artikel-Element kein 'name' attribut besitzt sondern ein 'ref' attribut:

<artikelliste>
  <artikel name="GelberStuhl">
    <beschreibung>Beschreibung zu GelberStuhl</beschreibung>
    <preis>10</preis>
    <lieferant>Möbel Mustermann</lieferant>
  </artikel>
  <artikel ref="AllgemeinerStuhl" />
  <artikel name="BlauerTisch">
     <beschreibung>Beschreibung zu BlauerTisch</beschreibung>
     <preis>20</preis>
     <lieferant>Möbel Huber</lieferant
  <artikel>
</artikelliste>

Nun könntest du hergehen und zwei verschiedene Templates erstellen. Das erste (falls das Artikel-Element ein 'name'-Attribut besitzt) ist trivial, und das machst du so wie du vorhast. Für zweiteres könnest du das jetzt ein wenig umbauen:

<xsl:template match='artikel/@ref'>

<!-- kleiner Workaround - unschön, denn es wird die for-schleife
        immer nur einmal aufgerufen, aber mir fällt gerade keine
        andere möglich kein ein, möglichst einfach einen ganzen
        knoten in einem template zu selektieren und ihn dort zu
        "verarbeiten" ;-) -->

<xsl:for-each select="StandardArtikel/Artikel/@name={@ref}">
      Artikel: <xsl:value-of select="@name" /><br />
      Preis: <xsl:value-of select="preis" />
   </xs:for-each>

xsl:template

Einfach ein bissl rumprobieren ;-)

lg regenfeld