XSLT根据Child的值在第一个节点之前插入节点

时间:2017-04-13 08:33:57

标签: xml xslt

我的XML看起来像这样:

<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-Stylesheet来检查<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>

1 个答案:

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