我正在尝试解析一些包含<text />
节点中每个选项卡单元格的数据。我需要忽略以星号*
开头的节点以及后面的4个节点。这可以用xpath完成,还是我需要以不同的方式解决这个问题?
编辑:我的XML如下所示:
<page>
<text attr="123" attr2="1234">ROW 1 CELL 1</text>
<text attr="123" attr2="1234">ROW 1 CELL 2</text>
<text attr="123" attr2="1234">ROW 1 CELL 3</text>
<text attr="123" attr2="1234">ROW 1 CELL 4</text>
<text attr="123" attr2="1234">ROW 1 CELL 5</text>
<text attr="123" attr2="1234">* ROW 2 CELL 1</text>
<text attr="123" attr2="1234">ROW 2 CELL 2</text>
<text attr="123" attr2="1234">ROW 2 CELL 3</text>
<text attr="123" attr2="1234">ROW 2 CELL 4</text>
<text attr="123" attr2="1234">ROW 2 CELL 5</text>
<text attr="123" attr2="1234">ROW 3 CELL 1</text>
<text attr="123" attr2="1234">ROW 3 CELL 2</text>
<text attr="123" attr2="1234">ROW 3 CELL 3</text>
<text attr="123" attr2="1234">ROW 3 CELL 4</text>
<text attr="123" attr2="1234">ROW 3 CELL 5</text>
</page>
答案 0 :(得分:4)
以下表达式:
/*/text[not(starts-with(., '*')) and
not(preceding::*[position()<5][starts-with(., '*')])]
根据您的输入选择以下内容:
<root>
<text attr="123" attr2="1234">ROW 1 CELL 1</text>
<text attr="123" attr2="1234">ROW 1 CELL 2</text>
<text attr="123" attr2="1234">ROW 1 CELL 3</text>
<text attr="123" attr2="1234">ROW 1 CELL 4</text>
<text attr="123" attr2="1234">ROW 1 CELL 5</text>
<text attr="123" attr2="1234">ROW 3 CELL 1</text>
<text attr="123" attr2="1234">ROW 3 CELL 2</text>
<text attr="123" attr2="1234">ROW 3 CELL 3</text>
<text attr="123" attr2="1234">ROW 3 CELL 4</text>
<text attr="123" attr2="1234">ROW 3 CELL 5</text>
</root>
跳过所有ROW 2
。
以下表达方式相同(根据De Morgan的法律):
/*/text[not(starts-with(., '*') or
preceding::*[position()<5][starts-with(., '*')])]
答案 1 :(得分:1)
这对你有用
//text[starts-with(.,"*")]/preceding-sibling::text
| //text[starts-with(.,"*")]/following-sibling::text[position() > 4]
对于提供的输入,它返回所需的节点
<text attr="123" attr2="1234">ROW 1 CELL 1</text>
<text attr="123" attr2="1234">ROW 1 CELL 2</text>
<text attr="123" attr2="1234">ROW 1 CELL 3</text>
<text attr="123" attr2="1234">ROW 1 CELL 4</text>
<text attr="123" attr2="1234">ROW 1 CELL 5</text>
<text attr="123" attr2="1234">ROW 3 CELL 1</text>
<text attr="123" attr2="1234">ROW 3 CELL 2</text>
<text attr="123" attr2="1234">ROW 3 CELL 3</text>
<text attr="123" attr2="1234">ROW 3 CELL 4</text>
<text attr="123" attr2="1234">ROW 3 CELL 5</text>
然而,正如@lwburk在评论中指出的那样,如果您有多个以*开头的节点,则它不适用于一般情况。这是因为与这两个语句配对的|
运算符最终选择了两个匹配节点之前和之后的所有内容。他的解决方案正确处理了两种情况。