如何让XPath在未找到值时返回默认值?(支持XSLT1.0/2.0/3.0)
XPath查询无匹配时返回指定默认值的问题
测试XML数据
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ORDERS05> <IDOC BEGIN="1"> <E1EDK14 SEGMENT="1"> <QUALF>006</QUALF> <ORGID>00</ORGID> </E1EDK14> <E1EDK14 SEGMENT="1"> <QUALF>008</QUALF> <ORGID>NL01</ORGID> </E1EDK14> <E1EDK14 SEGMENT="1"> <QUALF>012</QUALF> <ORGID>ZOR</ORGID> </E1EDK14> </IDOC> </ORDERS05>
需求
使用XSLT 1.0、2.0或3.0编写XPath表达式,要求:
- 找到匹配节点且值非空时,返回节点文本值
- 未找到匹配节点或节点值为空时,返回默认值
not-found
尝试过的表达式及问题
测试时,当查询条件(如QUALF="008")匹配,以下表达式能返回正确值;但条件不匹配(如QUALF="008xx")时,工具返回自带的No Match!,而非预期的not-found:
XSLT 2.0表达式
/ORDERS05/IDOC/E1EDK14[QUALF="008xx"]/ORGID/(text()/string(), "not-found")[1]
XSLT 3.0表达式
/ORDERS05/IDOC/E1EDK14[QUALF="008xx"]/ORGID ! (text(), "not-found")[1]
/ORDERS05/IDOC/E1EDK14[QUALF="008xx"]/ORGID ! (node(), "not-found")[1]
问题根源:当E1EDK14[QUALF="008xx"]无匹配节点时,整个路径返回空序列,后续的/(...)或!(...)逻辑不会执行,工具因此返回默认提示。
解决方案
XSLT 2.0/3.0 简洁写法
通过条件判断或序列拼接,确保无论是否找到节点都能触发默认值逻辑:
let $target := /ORDERS05/IDOC/E1EDK14[QUALF="008xx"]/ORGID/string() return if ($target) then $target else "not-found"
更直观的条件判断版本:
if (exists(/ORDERS05/IDOC/E1EDK14[QUALF="008xx"]/ORGID) and normalize-space(/ORDERS05/IDOC/E1EDK14[QUALF="008xx"]/ORGID)) then string(/ORDERS05/IDOC/E1EDK14[QUALF="008xx"]/ORGID) else "not-found"
XSLT 1.0 写法
XSLT 1.0不支持简化语法,可通过字符串拼接和长度判断实现纯XPath逻辑:
substring( concat(string(/ORDERS05/IDOC/E1EDK14[QUALF="008xx"]/ORGID), "not-found"), 1, string-length(string(/ORDERS05/IDOC/E1EDK14[QUALF="008xx"]/ORGID)) * (string-length(string(/ORDERS05/IDOC/E1EDK14[QUALF="008xx"]/ORGID)) > 0) + 9 * (string-length(string(/ORDERS05/IDOC/E1EDK14[QUALF="008xx"]/ORGID)) = 0) )
若在XSLT模板中使用,更推荐用<xsl:choose>提升可读性:
<xsl:choose> <xsl:when test="/ORDERS05/IDOC/E1EDK14[QUALF='008xx']/ORGID and normalize-space(/ORDERS05/IDOC/E1EDK14[QUALF='008xx']/ORGID)"> <xsl:value-of select="/ORDERS05/IDOC/E1EDK14[QUALF='008xx']/ORGID"/> </xsl:when> <xsl:otherwise>not-found</xsl:otherwise> </xsl:choose>
参考内容翻译
原参考问题标题:XPATH to select all not null childs plus a default value when not found
翻译:XPath查询所有非空子节点,且未找到时返回默认值
内容的提问来源于stack exchange,提问作者user2215655
相关产品推荐
相关产品推荐

