如果前面的兄弟节点是这些蛋糕之一

时间:2014-03-19 15:04:15

标签: asp.net xml xslt xslt-1.0

我的xml看起来像这样

<cakes>
   <chocolate>for Tom</chocolate>
   <vanilla>for Jim</vanilla>
   <strawberry>for Harry</strawberry>
   <vanilla>for Sue</vanilla>
</cake>

我正在寻找能够像这样工作的xslt

<xsl:template match="vanilla">
   <xsl:if test="IF THE ELEMENT RIGHT BEFORE THIS ONE IS CHOCOLATE OR BLACKFOREST">
      <p>After a great cake <xsl:value-of select="chocolate | blackforest"/></p>
   </xsl:if>

   <p>There is a vanilla cake <xsl:value-of select="."/></p>
</xsl:template>

输出应为

After a great cake for Tom
There is a vanilla cake for Jim
There is a vanilla cake for Sue

我怀疑答案与previous-sibling :: * [1]有关,但是我无法找到如何测试这是否是特定节点类型。

我在asp.net开发。

1 个答案:

答案 0 :(得分:2)

  

我怀疑答案与previous-sibling :: * [1]有关,但是我无法找到如何测试这是否是特定节点类型。

是的,这确实是解决方案。您可以通过检查元素名称name() 1 来测试节点是否是特定元素。

请注意,此解决方案&#34;报告&#34; chocolateblackforest个元素,只有在vanilla元素之前。此外,它以受控方式输出文本,仅在xsl:text个元素内输出。这就是为什么必须将换行符显式添加到XSLT代码中。

<强>样式表

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

   <xsl:output method="text"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="vanilla">
        <xsl:if test="preceding-sibling::*[1][name() = 'chocolate' or name() = 'blackforest']">
            <xsl:text>After a great cake </xsl:text>
            <xsl:value-of select="preceding-sibling::*[1]"/>
            <xsl:text>&#10;</xsl:text>
        </xsl:if>
        <xsl:text>There is a vanilla cake </xsl:text>
        <xsl:value-of select="."/>
        <xsl:text>&#10;</xsl:text>
    </xsl:template>

    <xsl:template match="text()"/>

</xsl:stylesheet>

<强>输出

After a great cake for Tom
There is a vanilla cake for Jim
There is a vanilla cake for Sue

1 实际上,name()返回元素的完整限定名称。如果元素带有前缀,则也会返回前缀。您可以使用local-name()仅输出&#34; local&#34;合格名称的一部分。