XSLT - 有条件地添加新节点

时间:2015-08-10 10:49:55

标签: xml xslt xslt-2.0

我有xml如下,

<doc>
    <section id="1">This is <style type="normal">first</style> chapter</section>
    <section id="2">This is <style type="normal">second</style> chapter</section>
    <section id="3">This is <style type="normal">third</style> chapter</section>
    <section id="4">This is <style type="normal">forth</style> chapter</section>
    <section id="5">This is <style type="normal">fifth</style> chapter</section>
    <section id="6">This is <style type="normal">sixth</style> chapter</section>
    <section id="7">This is <style type="normal">seventh</style> chapter</section>
</doc>

我需要的是有条件地添加名为<newNode>的新节点。我写的xsl如下,

<xsl:variable name="var" as="xs:boolean" select="true()"/>

    <xsl:template match="section[position()=last()]">
        <section id="{@id}">
            <xsl:apply-templates/>
        </section>
        <newNode>New Node</newNode>
    </xsl:template>

    <xsl:template match="section[position()=3]">
        <section id="{@id}">
            <xsl:apply-templates/>
        </section>
        <newNode>New Node</newNode>
    </xsl:template>

我的要求是,如果var值为true(),则在第3部分下添加新节点,如果var值为false(),则在最后部分节点下添加新节点。我已写过要在第3部分和最后部分添加<newNode>。但是无法想到有条件地检查var值并相应地添加<newNode>的方法。

如何在xslt中执行此任务?

3 个答案:

答案 0 :(得分:4)

简化版@MartinHonnen的回答

<xsl:template match="section[position()=(if ($var) then 3 else last())]">
    <section id="{@id}">
        <xsl:apply-templates/>
    </section>
    <newNode>New Node</newNode>
</xsl:template>

答案 1 :(得分:2)

只需使用

<xsl:template match="section[not($var) and position()=last()]">
    <section id="{@id}">
        <xsl:apply-templates/>
    </section>
    <newNode>New Node</newNode>
</xsl:template>

<xsl:template match="section[$var and position()=3]">
    <section id="{@id}">
        <xsl:apply-templates/>
    </section>
    <newNode>New Node</newNode>
</xsl:template>

答案 2 :(得分:-1)

Martin Honnen的答案风格的变化:如果有理由限制match节点选择,你也可以在模板内的条件中放置任何依赖于$var的内容,

<xsl:template match="...">
  <xsl:if test="not($var)">
    <section id="{@id}">
    ...