我正在尝试找到一个干净的XPath1.0表达式,以返回特定节点之间的所有节点。所需经费如下:
为了测试我在做什么你可以用:
<t>
<s>ABC</s>
<s>123</s>
<s>DEF</s>
<s>456</s>
<s>GHI</s>
<s>JKL</s>
<s>(M)</s>
<s>NOP</s>
<s>(Q)</s>
</t>
我只想出“GHI”和“JKL”两个词:
//s[position()<count(//s[starts-with(., '(')][1]/preceding::*)+1][position()>count(//s[.*0=0][last()]/preceding::*)+1]
它工作得很好,但是我忍不住觉得这件事可以做得更顺利。为此,我认为应该有一种方法来使用前面Xpath中检索到的节点,例如:
获取最后一个数字节点之后的所有节点:[.*0=0][last()]/following::s
.
[starts-with(., '(')][1]
.
//s[.*0=0][last()]/following::s[position()<[starts-with(.,'(')][1]]
的内容显然是不正确的。有什么想法吗,还是我一开始就被困在自己身上了?我在Excel函数FILTERXML()
中使用这个。
发布于 2021-11-19 04:34:28
使用XPath1.0很难做到这一点(虽然XPath2.0非常容易),但是由于您使用的是FILTERXML()
和Excel,所以下面是一个可能的解决方法:
假设您的xml在A1中,那么在第一组的B1用户FILTERXML()
中:
=FILTERXML(A1,"//s[translate(., translate(.,'0123456789',''), '')][last()]//following::s")
Credit here goes to the "double translate" method.
在C1中也是这样:
=FILTERXML(A1,"//s[starts-with(., '(')][1]/preceding::s")
然后回到Excel。以下任一项:
=FILTER(B:B,COUNTIF(C:C,B:B))
或
=IF(ISERROR(MATCH(B:B,C:C,0)),"",B:B)
这应该输出“GHI”和“JKL”。
根据OP下面的注释,还有一种使用XPath1.0表达式using the Kayessian method的方法,在本例中,该表达式的形式是:
//s[translate(., translate(.,'0123456789',''), '')][last()]//following::s[count(. | //s[starts-with(., '(')][1]/preceding::s) = count(//s[starts-with(., '(')][1]/preceding::s)]
而且,奇怪的是,足够FILTERXML()
理解它!
https://stackoverflow.com/questions/70033195
复制