【问题标题】:How to determine if there is text at a node with xpath/schematron如何使用 xpath/schematron 确定节点是否有文本
【发布时间】:2015-07-14 20:52:34
【问题描述】:

我正在寻找一种编写 xpath/schematron 测试的方法来识别特定节点,只要它包含任何类型的非空白、直接在节点内的任何位置的未包装文本(意味着可能在中间,但不在子元素)。所以如果我的 xml 看起来像这样:

<root>
...
 <node>
     <arbitraryChild/>
     Find me
     <arbitraryChild>Don't find me</arbitraryChild>
     more text
 </node>
 ...
 <node>
     <arbitraryChild/> <arbitraryChild/>
     <arbitraryChild>Don't find me</arbitraryChild>
 </someNode>
...
</node>    

它会识别 somenode 的第一个实例,而不是第二个。我已经尝试了所有我能想到的 contains(...)、text() 和 test="..." 的变体,但显然我是从错误的方向来解决这个问题的。

【问题讨论】:

  • 这似乎可以工作test="normalize-space(text()[1])"我的解析器在我使用 text() 时会抱怨并失败,它会命中一个带有文本的节点,其中的孩子散布在字符串中间(它告诉我“一个序列不允许将多个节点作为第一个参数...")。因此,通过简单地跟踪第一个文本节点,我可以明确地说节点中有文本。不过,这似乎很愚蠢。必须有更好的方法......
  • 您能详细说明一下吗? xml中有错误吗?显然,它是一个空节点,但它只是用来传达文本之前可能存在一个元素。甚至可能是一个空的。 [编辑:预期收件人已删除评论,但信息可能仍然相关。]

标签: xml xpath schematron


【解决方案1】:

我觉得很简单

node[text()[normalize-space()]]

我认为@har07 的答案中的“和 *”与您的问题中所述的任何要求无关:您没有说必须至少有一个元素子元素,只是必须有 (非空)文本。

【讨论】:

  • 这行得通!我的错误是尝试text() and normalize-space()
【解决方案2】:

您可以尝试以下 XPath 表达式进行测试:

test="text()[normalize-space()] and *"

给定一个上下文元素,上面的表达式测试当前上下文元素是否有非空文本节点子节点以及子元素

我不熟悉,但该表达式在 XPath(用于 XPath 谓词中的 f.e)和 XSLT 中有效,因此值得一试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多