如何对XSLT属性求值并按条件跳过for-each循环节点?
嘿,我来帮你搞定这个XSLT的节点过滤需求~下面是两种实用的实现方式,结合你的示例给你详细说明:
解决方案
方法1:在for-each的select中直接过滤(推荐)
这种方式最高效,因为它从一开始就只选中符合条件的节点,不用遍历所有节点再做判断。修改你的XSLT模板如下:
<xsl:template match="some"> <xsl:for-each select="//deep//level[@availability >= 5]"> <xsl:value-of select="@code, @availability" separator=";"/> </xsl:for-each> </xsl:template>
细节说明:
- 这里用了XPath的谓词(方括号包裹的部分)
[@availability >= 5],直接筛选出availability属性值大于等于5的level节点 - 原代码里
value-of用的.//@code可以简化成@code,因为当前循环的上下文已经是level节点了,不用再递归查找子节点
方法2:在循环内部用xsl:if判断跳过
如果之后需要扩展更复杂的逻辑(比如除了判断还要做一些前置操作),可以在for-each内部加条件判断:
<xsl:template match="some"> <xsl:for-each select="//deep//level"> <xsl:if test="@availability >= 5"> <xsl:value-of select="@code, @availability" separator=";"/> </xsl:if> </xsl:for-each> </xsl:template>
细节说明:
xsl:if的test属性里写判断条件,只有当条件为真时,才会执行内部的value-of操作- 如果需要多分支判断(比如不同区间做不同处理),还可以用
xsl:choose配合xsl:when/xsl:otherwise来实现
测试验证
用你的XML示例测试:
<some> <deep> <level availability="10" code="A"/> </deep> </some>
两种方法都会输出A;10,因为availability=10满足>=5的条件。如果把availability改成3,就会跳过这个节点,不会输出任何内容。
内容的提问来源于stack exchange,提问作者membersound
相关产品推荐
相关产品推荐

