仅当节点是包含属性的特定节点的子节点时,才搜索所有出现的字符串

时间:2019-03-20 17:26:15

标签: xml xpath

考虑以下示例:

<foo attr1="dummy">
   <bar1>
     some text #{abc} some text
   </bar1>
   <bar2>
     <bar2bar2>
        some text #{def} some text
     </bar2bar2>
   </bar2>
</foo>

我需要一个XPath 1.0查询(不支持正则表达式),当节点是(直接或间接)节点的子节点时,搜索所有出现的#{*} foo ,其属性为 attr1 。换句话说,查询应返回:

some text #{abc} some other text
some text #{def} some other text

2 个答案:

答案 0 :(得分:1)

(回答原始问题):尝试以下XPath-1.0表达式:

//text()[starts-with(normalize-space(.),'#{') and substring(normalize-space(.),string-length(normalize-space(.)),1)='}' and  ancestor::foo[@attr1]]

它返回所需的text()节点,但带有前导和尾随空格。在XPath-1.0中无法避免这一点,因为normalize-space()函数仅采用一个参数。在XPath-2.0中,您可以简单地在表达式的末尾添加/normalize-space()来处理该问题。

答案 1 :(得分:1)

  

我需要一个用于搜索的XPath 1.0查询(不支持正则表达式)   当节点为(直接或间接)时出现的所有#{*}   属性为 attr1 的节点 foo 的子级。换句话说,查询   应该返回

//foo//text()[contains(.,'#{')][contains(substring-after(.,'#{'),'}')]

请注意,该表达式将选择文本节点。如果您混合了内容(元素具有文本和编组,例如HTML p具有emspan),则该字符串将被拆分为多个文本节点。为此,您将需要以下答案:How can I find a node in HTML which has marked-up text by searching for the plaintext?