You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:42:53