我的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开发。
答案 0 :(得分:2)
我怀疑答案与previous-sibling :: * [1]有关,但是我无法找到如何测试这是否是特定节点类型。
是的,这确实是解决方案。您可以通过检查元素名称name()
1 来测试节点是否是特定元素。
请注意,此解决方案&#34;报告&#34; 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()
仅输出&#34; local&#34;合格名称的一部分。