限制XPath谓词:以

限制XPath谓词:以,xpath,openxml,Xpath,Openxml,我正在使用XPath1.0(摘录)浏览此office open xml文件: 所以我过滤,然后再上升。这是可行的,但我想在这里更好地理解XPath——我发现没有办法过滤谓词。你能给我指出一个有效的类似于执行类似于//row[genderant::t[starts-with()…]的操作的方法吗 非常感谢您的帮助。一个选项: .//row[starts-with(descendant::t/text(),'[') and substring(descendant::t/text(), string

我正在使用XPath1.0(摘录)浏览此office open xml文件:

所以我过滤,然后再上升。这是可行的,但我想在这里更好地理解XPath——我发现没有办法过滤谓词。你能给我指出一个有效的类似于执行类似于
//row[genderant::t[starts-with()…]
的操作的方法吗

非常感谢您的帮助。

一个选项:

.//row[starts-with(descendant::t/text(),'[') and substring(descendant::t/text(), string-length(descendant::t/text())) = ']' ]
这将为您提供行,但是一个重要的问题是,如果您的
有两个
t
元素将满足不同的条件,但不是两个条件。e、 g.一个
t
以[]开头,另一个以]

显然,你所拥有的并没有这个问题

另一个选项:使用translate

.//row[translate(descendant::t/text(),"0123456789","") = "[]"]
这将去除数字字符,然后与[]字符进行简单比较,一个选项:

.//row[starts-with(descendant::t/text(),'[') and substring(descendant::t/text(), string-length(descendant::t/text())) = ']' ]
这将为您提供行,但是一个重要的问题是,如果您的
有两个
t
元素将满足不同的条件,但不是两个条件。e、 g.一个
t
以[]开头,另一个以]

显然,你所拥有的并没有这个问题

另一个选项:使用translate

.//row[translate(descendant::t/text(),"0123456789","") = "[]"]
这将去掉数字字符,然后与[]字符进行简单比较

从技术上讲,我需要找到第一个 包含子代::t 以
[
开始,以
]
结束

从技术上讲,我需要找到第一个 包含子代::t 以
[
开始,以
]
结束


感谢您突出显示第一个选项的潜在问题。感谢您突出显示第一个选项的潜在问题。但是,即使使用解决方案的子集(.//行[以(后代::t/text(),“[”)]开头)测试第一个选项时,我在XMLSpy中也会遇到“太多项”错误,并且在我的程序中没有结果。可能是因为第二个选项的后代::t可能大于1?我认为如果内[]是整数,这是可以的,但实际上是整数[a-zA-Z0-9\.]并且可能是任何字符,所以我认为这不适合我的特殊问题。@PeerBr:您可以在translate的第二个参数中添加额外的字符可能性,尽管这可能会变得非常大。感谢您为第一个选项突出显示潜在问题。感谢您为fir突出显示潜在问题st选项。但是,即使使用解决方案的子集(.//行[以(后代::t/text(),'[')]开头)测试第一个选项时,我在XMLSpy中遇到“项目太多”错误,并且在我的程序中没有结果。可能是因为第二个选项的后代::t可以大于1?我认为如果是整数,但实际上是[a-zA-Z0-9\.]而且可能是任何字符,所以我认为这不适合我的特殊问题。@PeerBr:你可以在translate的第二个参数中添加额外的字符可能性,尽管它显然会变得相当大。3)正是我想要的-我不知道我可以嵌套谓词,而且.运算符仍然让我困惑l有时:-)谢谢。@PeerBr:你很好。另外,请注意最后一个表达式的性能不是最好的(启动
/
操作符,首先使用
()
强制表达式求值,可能会失去优化)。如果你知道你的输入模式,你应该使用第一个表达式。3)正是我想要的-我不知道我可以嵌套谓词,而且。运算符有时也让我困惑:-)谢谢。@PeerBr:你很好。另外,请注意最后一个表达式的性能不是最好的(启动
/
运算符,首先使用
()
强制表达式求值可能会失去优化)。如果您知道输入模式,则应使用第一个表达式。
/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]