10

我有一个使用 XPath 从 XML 文件中提取数据的应用程序。如果该 XML 源文件中的某个节点丢失,我想返回值“N/A”(很像 Oracle NVL 函数)。诀窍是应用程序不支持 XSLT。我想单独使用 XPath 和 XPath 来做到这一点。

那可能吗?

4

5 回答 5

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计算出包含多个节点的节点集,则使用一个节点的字符串值。

于 2008-09-03T03:58:06.863 回答
3

简短的回答:没有。XPath 规范的第 2 版考虑并明确拒绝了这样的函数(请参阅非规范说明性用户编写函数部分)。

于 2008-09-02T20:01:25.993 回答
2

对于空节点,您需要

boolean(string-length($node))

(您可以省略对的调用,number()因为这里隐含了从布尔到数字的转换。)

于 2008-09-04T03:28:57.423 回答
1

它可以用 XPath 1.0 完成。说你有

<foo>
  <bar/>
</foo>

如果你想测试是否foobaz孩子,

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

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

于 2008-09-03T03:40:27.683 回答
1

@jelovirt

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

为了澄清您所说的,这种方法在节点丢失时有效,而不是在节点为空时有效。但是通过将“number(boolean($node))”替换为“string-length($node)”,它将改为在空节点上工作。

于 2008-09-03T13:54:31.093 回答