限制XPath谓词:谓词以。开头

时间:2010-10-04 18:35:55

标签: xpath openxml

我使用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()...]]这样的事情。

非常感谢任何帮助。

2 个答案:

答案 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","") = "[]"]

这将删除数字字符,然后它与[]字符

进行简单比较