XSL中select语句括号内queryString变量无法读取问题排查
XSLT中queryString变量无法在count筛选中生效的问题解决
问题原因
你定义的$queryString是字符串类型的Sold='False',但在XPath谓词[$queryString]里,XSLT不会把这个字符串当作筛选表达式执行——它只会判断字符串是否非空(非空即返回true),所以实际是统计了所有//responseAfterTransform节点的数量,而非符合Sold='False'条件的节点。XPath不支持直接将字符串当作动态表达式解析。
解决方案
方案1:直接在谓词中写筛选逻辑(静态条件)
如果筛选条件是固定的,直接把逻辑写到XPath里即可:
<xsl:value-of select="count(//responseAfterTransform[Sold='False'])"/>
方案2:拆分条件为变量(动态条件适配)
如果需要动态调整筛选值,把条件拆成变量,直接在谓词中引用:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xsl:output indent="yes" omit-xml-declaration="yes"/> <xsl:template match="/"> <xsl:variable name="carMake" select="//input_payload/carMake"/> <!-- 单独定义筛选值变量 --> <xsl:variable name="soldStatus" select="'False'"/> <!-- 先筛选符合条件的节点,再统计数量 --> <xsl:variable name="filteredNodes" select="//responseAfterTransform[Sold=$soldStatus]"/> { carMake: <xsl:value-of select="$carMake"/>, querystring: Sold='<xsl:value-of select="$soldStatus"/>', "totalRecords": <xsl:value-of select="count($filteredNodes)"/> } </xsl:template> </xsl:stylesheet>
方案3:使用XSLT3.0的xsl:evaluate(动态表达式场景)
如果你的环境支持XSLT3.0,且必须使用字符串形式的表达式,可以用xsl:evaluate指令动态执行XPath:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xsl:output indent="yes" omit-xml-declaration="yes"/> <xsl:template match="/"> <xsl:variable name="carMake" select="//input_payload/carMake"/> <xsl:variable name="queryString" select="'Sold='False''"/> <!-- 动态执行表达式筛选节点 --> <xsl:variable name="filteredNodes"> <xsl:evaluate xpath="//responseAfterTransform[{$queryString}]" context-item="."/> </xsl:variable> { carMake: <xsl:value-of select="$carMake"/>, querystring: <xsl:value-of select="$queryString"/>, "totalRecords": <xsl:value-of select="count($filteredNodes)"/> } </xsl:template> </xsl:stylesheet>
内容的提问来源于stack exchange,提问作者JCastillo
相关产品推荐
相关产品推荐

