匹配后排除节点的Xpath

时间:2011-07-14 19:07:07

标签: xml xpath

我正在尝试解析一些包含<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>

2 个答案:

答案 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在评论中指出的那样,如果您有多个以*开头的节点,则它不适用于一般情况。这是因为与这两个语句配对的|运算符最终选择了两个匹配节点之前和之后的所有内容。他的解决方案正确处理了两种情况。