考虑以下示例:
<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
答案 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
具有em
或span
),则该字符串将被拆分为多个文本节点。为此,您将需要以下答案:How can I find a node in HTML which has marked-up text by searching for the plaintext?