关于xml:是否可以为XPath中的缺失标记创建值?

关于xml:是否可以为XPath中的缺失标记创建值?

Can I create a value for a missing tag in XPath?

我有一个使用XPath从XML文件提取数据的应用程序。 如果该XML源文件中的节点丢失,我想返回值" N / A"(非常类似于Oracle NVL函数)。 诀窍是该应用程序不支持XSLT。 我想单独使用XPath和XPath进行此操作。

那可能吗?


可以这样做,但前提是该节点确实存在时的返回值是该节点的字符串值,而不是该节点本身。 XPath

1
substring(concat("N/A", /foo/baz), 4 * number(boolean(/foo/baz)))

将返回baz元素的字符串值(如果存在),否则返回字符串" N / A"。

概括该方法:

1
2
substring(concat($null-value, $node),
          (string-length($null-value) + 1) * number(boolean($node)))

其中,$null-value是空值字符串,而$node是用于选择节点的表达式。请注意,如果$node求值为包含多个节点的节点集,则使用第一个节点的字符串值。


简短的回答:不。对于XPath规范的版本2,考虑并明确拒绝了此类功能(请参阅非规范性说明性用户编写的功能部分)。


对于空节点,您需要

1
boolean(string-length($node))

(您可以忽略对number()的调用,因为从boolean到number的转换在这里是隐式的。)


@jelovirt

因此,如果我正确理解了这一点,我们将默认答案和节点的值连接起来,然后通过测试节点的存在以将偏移量设置为零或将其设置为零,从而获取结果字符串的正确子集。默认字符串。这是我见过的最扭曲的语言。 (我喜欢它!)

为了澄清您的意见,此方法在节点丢失时有效,而不是在节点为空时有效。但是通过将" number(boolean($ node))"替换为" string-length($ node)",它将代替空节点。


可以使用XPath 1.0来完成。说你有

1
2
3
<foo>
  <bar/>
</foo>

如果要测试foo是否有baz子代,

1
substring("N/A", 4 * number(boolean(/foo/baz)))

如果表达式/foo/baz返回空节点集,则将返回" N / A",否则返回空字符串。


推荐阅读