如何在XSLT中测试子节点值?我的判断逻辑为何失效?
XSLT条件判断错误分析与修正
错误原因
你的XPath表达式逻辑不符合预期:
//product/productCode[not(contains(.,'66889'))]表示存在至少一个productCode节点不包含66889,而不是整个文档中不存在任何包含66889的productCode节点。- 你的XML中存在
ABC、66890这类不包含66889的productCode,所以这个条件会返回true,导致第一个<xsl:when>被触发,即便文档里有66889。
另外,你的代码还存在语法错误:未闭合<xsl:choose>标签,也未处理第二个条件的分支。
修正后的代码
先明确逻辑优先级:更具体的条件(情况1)需要放在前面,避免被宽泛条件覆盖。同时用精确匹配替代contains,防止误匹配类似668891这类无关值。
完整修正代码如下:
<xsl:choose> <!-- 情况1:存在productCode为66890 且 不存在productCode为66889 --> <xsl:when test="//productCode[text()='66890'] and not(//productCode[text()='66889'])"> <!-- 执行操作A:创建表格 --> <table> <!-- 表格内容 --> </table> </xsl:when> <!-- 情况2:存在productCode为66890 或 存在productCode为66889 --> <xsl:when test="//productCode[text()='66890'] or //productCode[text()='66889']"> <!-- 执行操作B --> <p>执行另一操作</p> </xsl:when> <!-- 可选:处理既不存在66890也不存在66889的情况 --> <xsl:otherwise> <p>无目标productCode</p> </xsl:otherwise> </xsl:choose>
补充说明
- 如果productCode节点可能包含前后空格,可添加
normalize-space()处理,例如://productCode[normalize-space(text())='66890']。 - 若只需匹配嵌套在
<product>节点下的productCode,将//productCode改为//product/productCode即可。
内容的提问来源于stack exchange,提问作者Pooja
相关产品推荐
相关产品推荐

