题
我有一个使用 XPath 从 XML 文件中提取数据的应用程序。如果该 XML 源文件中的节点丢失,我想返回值“N/A”(很像 Oracle NVL 函数)。问题在于该应用程序不支持 XSLT;我想仅使用 XPath 和 XPath 来完成此操作。
那可能吗?
解决方案
可以这样做,但前提是节点确实存在时的返回值为 节点的字符串值,而不是节点本身. 。X路径
substring(concat("N/A", /foo/baz), 4 * number(boolean(/foo/baz)))
将返回的字符串值 baz
元素(如果存在),否则字符串“N/A”。
概括该方法:
substring(concat($null-value, $node),
(string-length($null-value) + 1) * number(boolean($node)))
在哪里 $null-value
是空值字符串并且 $node
选择节点的表达式。请注意,如果 $node
求值为包含多个节点的节点集,该节点的字符串值 第一的 使用节点。
其他提示
简短回答:不。XPath 规范的第 2 版考虑并明确拒绝了这样的函数(请参阅非规范 说明性用户编写函数部分).
对于空节点,您需要
boolean(string-length($node))
(您可以省略对 number()
因为从布尔值到数字的转换在这里是隐式的。)
可以使用 XPath 1.0 来完成。说你有
<foo>
<bar/>
</foo>
如果你想测试是否 foo
有一个 baz
孩子,
substring("N/A", 4 * number(boolean(/foo/baz)))
如果表达式将返回“N/A” /foo/baz
返回一个空节点集,否则返回一个空字符串。
@jelovirt
因此,如果我正确理解这一点,我们将默认答案和节点的值连接起来,然后通过测试节点是否存在来获取结果字符串的正确子集,以将偏移量设置为零或紧随我之后的位置默认字符串。这是我见过的对语言最反常的扭曲。(我喜欢它!)
为了澄清你所说的,这种方法在节点丢失时有效,而不是在节点为空时有效。但是通过将“number(boolean($node))”替换为“string-length($node)”,它将在空节点上工作。
不隶属于 StackOverflow