XSLT 3.0中用XPath统计type=1且status=2的card节点求助
解决XSLT统计符合条件的card节点数量问题
我来帮你搞定这个统计需求!先梳理下你现有代码里的问题,再给你适配XSLT 3.0的解决方案。
原代码的问题
你的XPath表达式存在语法错误://card/[Prop[@prop_name='type' and @val='1'] and Prop[@prop_name='status' and @val='2']] 里的card/[多了一个斜杠,正确的写法应该是card[。另外你的XSLT声明的是1.0版本,而你需要使用3.0,所以首先要更新stylesheet的版本声明。
修正后的XSLT 3.0代码
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" encoding="UTF-8" indent="yes" omit-xml-declaration="yes" /> <xsl:strip-space elements="*"/> <xsl:template match="/"> <!-- 修正XPath语法,统计符合条件的card数量 --> <xsl:variable name="nb_active_cards" select="count(//card[Prop[@prop_name='type' and @val='1'] and Prop[@prop_name='status' and @val='2']])"/> <xsl:value-of select="$nb_active_cards" /> </xsl:template> </xsl:stylesheet>
代码说明
- 版本适配:将
<xsl:stylesheet>的version属性改为3.0,XSLT 3.0完全兼容1.0的核心语法,同时支持更多新特性。 - XPath逻辑:修正后的表达式会筛选出同时满足以下两个条件的
card节点:- 包含一个
Prop子节点,其prop_name属性值为type且val属性值为1 - 包含一个
Prop子节点,其prop_name属性值为status且val属性值为2
- 包含一个
- 结果验证:针对你的
source.xml,符合条件的是编号为0003和0004的两个card,所以最终输出结果为2。
额外优化(XSLT 3.0特性)
如果你想利用XSLT 3.0的简化写法,也可以直接在输出中计算,省略变量(效果完全一致):
<xsl:template match="/"> <xsl:value-of select="count(//card[Prop[@prop_name='type' and @val='1'] and Prop[@prop_name='status' and @val='2']])" /> </xsl:template>
内容的提问来源于stack exchange,提问作者XSL Noob
相关产品推荐
相关产品推荐

