我使用XPath 1.0 (摘录)浏览此办公室开放xml文件:
<sheetData ref="A1:XFD108">
<row spans="1:3" r="1">
<c t="s" r="A1">
<is>
<t>FirstCell</t>
</is>
</c>
<c t="s" r="C1">
<is>
<t>SecondCell</t>
</is>
</c>
</row>
<row spans="1:3" r="2">
<c t="s" r="A2">
<is>
<t>ThirdCell</t>
</is>
</c>
<c t="s" r="C2">
<is>
<t>[persons.ID]</t>
</is>
</c>
</row>
</sheetData>
我需要找到一个单词“[persons.ID]”,这是一个变量。从技术上讲,我需要找到包含以<row>
开头并以descendant::t
结束的[
的第一个]
。我目前有:
.//row//t[starts-with(text(), '[') and
substring(text(), string-length(text())) = ']']/ancestor::row
所以我过滤然后再次上升。它有效,但我想在这里更好地理解XPath - 我发现没有办法过滤谓词。你能指点我做一些像.//row[descendant::t[starts-with()...]]
这样的事情。
非常感谢任何帮助。
答案 0 :(得分:3)
从技术上讲,我需要找到第一个 包含一个后代:: t 以
[
开头,以]
结束。
/sheetData/row[c/is/t[starts-with(.,'[')]
[substring(.,string-length(.))=']']]
[1]
或
/sheetData/row[.//t[starts-with(.,'[') and
substring(.,string-length(.))=']']][1]
或
(//row[.//t[starts-with(.,'[') and
substring(.,string-length(.))=']']])[1]
答案 1 :(得分:1)
一个选项:
.//row[starts-with(descendant::t/text(),'[') and substring(descendant::t/text(), string-length(descendant::t/text())) = ']' ]
这会给你一行,但是如果你的row
有两个t
元素可以满足不同的条件,但不是两个条件,那么一个重要的问题就是。例如一个t
以[开头,另一个以]
很明显,你所拥有的没有这个问题
另一种选择:使用翻译
.//row[translate(descendant::t/text(),"0123456789","") = "[]"]
这将删除数字字符,然后它与[]字符
进行简单比较