我有一个使用XPath从XML文件中提取数据的应用程序。如果缺少该XML源文件中的节点,我想返回值“N / A”(非常类似于Oracle NVL函数)。诀窍是应用程序不支持XSLT;我想单独使用XPath和XPath来做这件事。
这可能吗?
答案 0 :(得分:5)
可以这样做但仅当节点存在时的返回值是节点的字符串值,而不是节点本身。 XPath
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
求值为包含多个节点的节点集,则使用 first 节点的字符串值。
答案 1 :(得分:3)
简答:不。对XPath规范的第2版考虑并明确拒绝了这样的函数(参见非规范Illustrative User-written Functions section)。
答案 2 :(得分:2)
对于空节点,您需要
boolean(string-length($node))
(你可以省略对number()
的调用,因为这里隐含了从布尔到数字的转换。)
答案 3 :(得分:1)
可以使用XPath 1.0完成。说你有
<foo>
<bar/>
</foo>
如果您想测试foo
是否有baz
孩子,
substring("N/A", 4 * number(boolean(/foo/baz)))
如果表达式/foo/baz
返回空节点集,将返回“N / A”,否则返回空字符串。
答案 4 :(得分:1)
@jelovirt
因此,如果我正确理解了这一点,我们会连接默认答案和节点的值,然后通过测试节点是否存在将偏移量设置为零或位置来获取结果字符串的正确子集在我的默认字符串之后。这是我所见过的最不正常的语言扭曲。 (我喜欢它!)
为了阐明您所说的内容,此方法在缺少节点时有效,而在节点为空时无效。但是通过将“number(boolean($ node))”替换为“string-length($ node)”,它将适用于空节点。