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



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

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

我在asp.net中开发。

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

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

注意,该解决方案仅在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()只输出限定名的"local"部分。

相关内容

  • 没有找到相关文章

最新更新