2017-04-13 107 views
0

价值的第一个节点之前,我的XML看起来是这样的:XSLT插入节点基于儿童

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

转型后应该是这样的:

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

种类的数量可以变量,所以我需要一个XLST样式表,它检查<Categorie>标签的值是否是第一个。

如果是,就应该这部分复制文章上面:

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

这里是我的尝试:

重要的是知道我仅限于V1.0

<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

你说“*最后一个节点后插入节点*”,但你的意思**组中的第一个节点之前**,不是吗? –

回答

0

我想你想要做的事:

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

谢谢迈克尔,这是我想要的。 – Myru