2017-04-13 5 views
0

Meine XML sieht wie folgt aus:XSLT einfügen Knoten vor dem ersten Knoten basierend auf dem Wert der Kinder

<Articles> 
     <Article> 
      <Position>Body</Position> 
      <Categorie>Food</Categorie> 
      <ProductName>Apple</ProductName> 
     </Article> 
     <Article> 
      <Position>Body</Position> 
      <Categorie>Food</Categorie> 
      <ProductName>Pineapple</ProductName> 
     </Article> 
     <Article> 
      <Position>Body</Position> 
      <Categorie>Drinks</Categorie> 
      <ProductName>Water</ProductName> 
     </Article> 
     <Article> 
      <Position>Body</Position> 
      <Categorie>Drinks</Categorie> 
      <ProductName>CocaCola</ProductName> 
     </Article> 
</Articles> 

nach der Transformation es sollte wie folgt aussehen:

<Articles> 
     <Article> 
      <Position>Title</Position> 
      <Titlename>Food</Titlename> 
     </Article> 
     <Article> 
      <Position>Body</Position> 
      <Categorie>Food</Categorie> 
      <ProductName>Apple</ProductName> 
     </Article> 
     <Article> 
      <Position>Body</Position> 
      <Categorie>Food</Categorie> 
      <ProductName>Pineapple</ProductName> 
     </Article> 
     <Article> 
      <Position>Title</Position> 
      <Titlename>Drinks</Titlename> 
     </Article> 
     <Article> 
      <Position>Body</Position> 
      <Categorie>Drinks</Categorie> 
      <ProductName>Water</ProductName> 
     </Article> 
     <Article> 
      <Position>Body</Position> 
      <Categorie>Drinks</Categorie> 
      <ProductName>CocaCola</ProductName> 
     </Article> 
</Articles> 

Die Anzahl der Kategorien sein kann Variable, also brauche ich ein XLST-Stylesheet, das prüft, ob der Wert <Categorie> Tag der erste ist.

Wenn ja, sollte es diesen Teil über dem Artikel kopieren:

 `<Article> 
     <Position>Title</Position> 
     <Titlename>Food</Titlename> 
     </Article>` 

Hier ist mein Versuch:

Wichtig zu wissen i v1.0 begrenzt bin

<xsl:for-each select="Article"> 
    <xsl:if test="Position/Categorie = First()"> 
     <Article> 
      <Position><xsl:value-of Select ="Title"></Position> 
      <Titlename><xsl:value-of Select ="Categorie"></Titlename> 
     </Article> 
    </xsl:if> 


     <Article> 
      <Position><xsl:value-of Select ="Position"></Position> 
      <Categorie><xsl:value-of Select ="Categorie"></Categorie> 
      <ProductName><xsl:value-of Select ="ProductName"></ProductName> 
     </Article> 
</xsl:for-each> 
+0

Sie sagen „* Knoten einfügen nach dem letzten Knoten *“, aber sie bedeuten ** vor dem ersten Knoten ** in der Gruppe, nicht wahr? –

Antwort

0

Ich denke, Sie möchten:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/Articles"> 
    <xsl:copy> 
     <xsl:for-each select="Article"> 
      <xsl:if test="not(Categorie=preceding-sibling::Article/Categorie)"> 
       <Article> 
        <Position>Title</Position> 
        <Titlename> 
         <xsl:value-of select="Categorie"/> 
        </Titlename> 
       </Article> 
      </xsl:if> 
      <xsl:copy-of select="."/> 
     </xsl:for-each>  
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 
+0

Danke Michael, das ist genau was ich gesucht habe. – Myru

Verwandte Themen