如何编写XSL:if条件判断任意D节点的attribute2含指定字符串
问题:判断任意D节点的attribute2是否包含指定字符串
给定XML结构:
<A> <B> <C> <D attribute1="testAttr1" attribute2="testAttr2"/> <D attribute1="testAttr1_2" attribute2="testAttr2_2"/> <D attribute1="testAttr1_3" attribute2="testAttr2_3"/> </C> </B> </A>
需要编写<xsl:if>条件,要求任意一个D子节点的attribute2属性包含字符串"Attr"时条件成立。尝试的两种写法均不符合需求:
- 带
*的写法contains(A/B/C/*D/@attribute2,'Attr')属于语法错误,无法生效 - 去掉
*的写法contains(A/B/C/D/@attribute2,'Attr')仅会匹配第一个D节点的属性
解决方案
要实现任意D节点满足条件时触发判断,核心是检查是否存在至少一个符合条件的D节点,有两种可行写法:
方法1:兼容XSLT 1.0的写法
直接通过节点过滤表达式判断存在性:
<xsl:if test="A/B/C/D[contains(@attribute2, 'Attr')]"> <!-- 条件成立时执行的逻辑 --> </xsl:if>
方法2:XSLT 2.0及以上推荐写法
使用exists()函数明确检查节点存在性:
<xsl:if test="exists(A/B/C/D[contains(@attribute2, 'Attr')])"> <!-- 条件成立时执行的逻辑 --> </xsl:if>
关键说明
- 表达式
A/B/C/D[contains(@attribute2, 'Attr')]会筛选出所有attribute2包含"Attr"的D节点,只要这个节点集不为空,整个条件就返回true。 - 之前的
contains(A/B/C/D/@attribute2,'Attr')仅取第一个D节点的attribute2值进行判断,因此只能匹配第一个节点。 - 错误的
*D是语法误用,*代表任意元素,不能与具体元素名D组合使用。
内容的提问来源于stack exchange,提问作者VGH
相关产品推荐
相关产品推荐

