XSLT 3.0中<xsl:on-non-empty>与<xsl:where-populated>的差异及疑问
XSLT中xsl:on-non-empty与xsl:where-populated的差异及空值判定解析
一、两个指令的核心差异
这两个指令看似功能相近,但判断逻辑和作用对象完全不同:
- xsl:where-populated:只关注自身子内容的输出结果。只有当子内容生成的序列非空时,才会保留该子内容的输出;如果子内容输出为空,整个指令直接无输出。
- xsl:on-non-empty:关注当前上下文的焦点序列(比如模板匹配的节点、正在处理的序列项)是否非空。只要焦点序列非空,就会执行自身的子内容——但子内容本身可能输出空(比如找不到目标节点时)。
简单总结:xsl:where-populated是「先执行子内容,再判断要不要保留输出」;xsl:on-non-empty是「先判断上下文是否符合条件,再执行子内容」。
二、示例代码与输出分析
输入XML
<?xml version="1.0" encoding="UTF-8"?> <a> <b>1<c>Cat</c></b> <b>2<c>Cow</c></b> <b>3<c>Dog</c></b> <b></b> <b>4<c>Fish</c></b> <b e="9">a<f>s</f></b> </a>
处理XSLT
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:template match="a/b"> <xsl:where-populated> <xsl:value-of select="c"/> </xsl:where-populated> <xsl:on-non-empty> <xsl:value-of select="c"/> </xsl:on-non-empty> <xsl:on-empty>EMPTY</xsl:on-empty> </xsl:template> </xsl:stylesheet>
输出结果
<?xml version="1.0" encoding="UTF-8"?> CatCat CowCow DogDog EMPTY FishFish EMPTY
三、最后一行输出EMPTY的原因
最后一个<b>节点<b e="9">a<f>s</f></b>本身非空,但模板输出被判定为空,触发<xsl:on-empty>的原因如下:
<xsl:where-populated>指令:尝试输出<c>节点的值,但该<b>没有<c>子节点,子内容输出为空,因此整个指令无输出。<xsl:on-non-empty>指令:当前匹配的<b>节点非空,满足执行条件,但内部的select="c"依然找不到目标节点,仅输出空字符串。<xsl:on-empty>指令:由于前两个指令的总输出为空(空字符串不属于有效非空输出),因此触发兜底逻辑,输出EMPTY。
注:XSLT声明的version="1.0"不支持这三个指令,实际是处理器按XSLT 2.0+规范执行的。
内容的提问来源于stack exchange,提问作者Chong Lip Phang
相关产品推荐
相关产品推荐

