You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>的原因如下:

  1. <xsl:where-populated>指令:尝试输出<c>节点的值,但该<b>没有<c>子节点,子内容输出为空,因此整个指令无输出。
  2. <xsl:on-non-empty>指令:当前匹配的<b>节点非空,满足执行条件,但内部的select="c"依然找不到目标节点,仅输出空字符串。
  3. <xsl:on-empty>指令:由于前两个指令的总输出为空(空字符串不属于有效非空输出),因此触发兜底逻辑,输出EMPTY。

注:XSLT声明的version="1.0"不支持这三个指令,实际是处理器按XSLT 2.0+规范执行的。

内容的提问来源于stack exchange,提问作者Chong Lip Phang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 02:31:10