如何用XSLT 2.0过滤掉所有属性均为空的元素?
解决方案
你的问题出在matches(., '')这个判断上——正则表达式里的空字符串会匹配任何字符串的任意位置,所以not(matches(., ''))永远为false,自然没法筛选出非空属性。
直接用更直观的方式检查属性值是否非空就行,这里有几种简洁的写法:
写法1:用exists()判断是否存在非空属性
<xsl:if test="exists(@*[string(.) != ''])"> <!-- 这里写你对有非空属性元素的处理逻辑 --> </xsl:if>
写法2:直接利用节点集的布尔特性
XPath中,非空的节点集会被判定为true,所以可以简化成:
<xsl:if test="@*[string(.) != '']"> <!-- 处理逻辑 --> </xsl:if>
进阶:直接在模板匹配中过滤
如果是要直接忽略所有属性全为空的元素,可以在模板层面处理,不用每个地方写判断:
<!-- 匹配所有属性全为空的元素,直接跳过不处理 --> <xsl:template match="*[not(@*[string(.) != ''])]"/> <!-- 正常处理有非空属性的元素 --> <xsl:template match="*"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template>
内容的提问来源于stack exchange,提问作者Mark Ainsworth
相关产品推荐
相关产品推荐

