【问题标题】:Can I create a value for a missing tag in XPath?我可以为 XPath 中的缺失标签创建一个值吗?
【发布时间】:2010-09-07 14:37:29
【问题描述】:

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

这可能吗?

【问题讨论】:

    标签: xml xslt xpath


    【解决方案1】:

    简短的回答:不。 XPath 规范的第 2 版考虑并明确拒绝了这样的功能(请参阅非规范的 Illustrative User-written Functions section)。

    【讨论】:

      【解决方案2】:

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

      <foo>
        <bar/>
      </foo>
      

      如果你想测试foo 是否有一个baz 孩子,

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

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

      【讨论】:

        【解决方案3】:

        可以这样做,但前提是节点确实存在时的返回值是节点的字符串值,而不是节点本身。 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 节点的字符串值。

        【讨论】:

          【解决方案4】:

          @jelovirt

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

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

          【讨论】:

            【解决方案5】:

            对于空节点,你需要

            boolean(string-length($node))
            

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

            【讨论】:

              猜你喜欢
              • 2021-07-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-08-08
              • 1970-01-01
              • 1970-01-01
              • 2023-03-24
              • 1970-01-01
              相关资源
              最近更新 更多