我的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。
注意,该解决方案仅在chocolate
或blackforest
元素紧接在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> </xsl:text>
</xsl:if>
<xsl:text>There is a vanilla cake </xsl:text>
<xsl:value-of select="."/>
<xsl:text> </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"部分。