如何在XSLT 1.0中用XPath 1.0选取首个IsFinalResult为true的MyObject元素
如何在XSLT 1.0中筛选数组里第一个IsFinalResult为true的元素?
嘿,我来帮你搞定这个XSLT 1.0的问题!咱们先明确需求:遍历ArrayOfMyObject下的MyObject元素,只匹配第一个满足IsFinalResult="true"的元素——哪怕后面还有其他符合条件的,也只处理这第一个。
针对你给出的代码结构,<xsl:when>里的test条件可以这么写:
<xsl:when test="IsFinalResult='true' and count(preceding-sibling::MyObject[IsFinalResult='true']) = 0">
逻辑拆解:
- 第一部分
IsFinalResult='true':先判断当前MyObject的属性是否符合要求; - 第二部分
count(preceding-sibling::MyObject[IsFinalResult='true']) = 0:统计当前节点之前的所有MyObject兄弟节点里,已经出现过的符合IsFinalResult='true'的数量。如果数量为0,说明当前节点是第一个满足条件的。
把这个条件代入你的完整代码里,就是这样:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <xsl:for-each select="ArrayOfMyObject/MyObject"> <xsl:choose> <xsl:when test="IsFinalResult='true' and count(preceding-sibling::MyObject[IsFinalResult='true']) = 0"> <!-- 这里只会执行一次,对应第一个符合条件的元素 --> </xsl:when> <xsl:otherwise> <!-- 处理其他不符合或者非第一个的元素 --> </xsl:otherwise> </xsl:choose> </xsl:for-each> </xsl:template> </xsl:stylesheet>
另外给你个更简洁的写法参考:其实你也可以不用for-each+choose的结构,直接通过select定位到第一个符合条件的元素,代码会更清爽:
<xsl:template match="/"> <xsl:apply-templates select="ArrayOfMyObject/MyObject[IsFinalResult='true'][1]"/> </xsl:template> <xsl:template match="MyObject"> <!-- 这里直接处理第一个符合条件的元素即可 --> </xsl:template>
如果你的业务逻辑必须保留for-each的结构,那第一种方案就完全适用。
内容的提问来源于stack exchange,提问作者Namek
相关产品推荐
相关产品推荐

