2011-07-01 185 views
2

我试图解析OpenOffice电子表格以获取第一列中具有唯一值的行。选择具有唯一值的元素

I.E.,我想从下面的XML片段中检索第一个子<table:table-cell>中具有唯一<text:p>值的所有<table:table-row>元素。

<table:table table:name="foo"> 
     <table:table-row> 
      <table:table-cell> 
       <text:p>1</text:p> 
      </table:table-cell> 
      <table:table-cell> 
       <text:p>foo</text:p> 
      </table:table-cell> 
     </table:table-row> 
     <table:table-row> 
      <table:table-cell> 
       <text:p>2</text:p> 
      </table:table-cell> 
      <table:table-cell> 
       <text:p>bar</text:p> 
      </table:table-cell> 
     </table:table-row> 
     <table:table-row> 
      <table:table-cell> 
       <text:p>1</text:p> 
      </table:table-cell> 
      <table:table-cell> 
       <text:p>baz</text:p> 
      </table:table-cell> 
     </table:table-row> 
    </table:table> 

我喜欢让下面的输出节点

 <table:table-row> 
      <table:table-cell> 
       <text:p>1</text:p> 
      </table:table-cell> 
      <table:table-cell> 
       <text:p>foo</text:p> 
      </table:table-cell> 
     </table:table-row> 
     <table:table-row> 
      <table:table-cell> 
       <text:p>2</text:p> 
      </table:table-cell> 
      <table:table-cell> 
       <text:p>bar</text:p> 
      </table:table-cell> 
     </table:table-row> 

我怎样才能做到这一点使用XPath?

+0

的XPath仅仅是一个得到一个定义的元素系列表达|属性|您的DOM节点。你想要的是将你的初始XML文件转换为另一个。您可以通过使用XSLT,然后使用XSLT使用XPath表达式来实现。 – Spredzy

+1

我想要得到节点,我不会想到我也能得到XML。谢谢。 – Aru

回答

0

这个XPath产生所需的输出: /table:table/table:table-row[not(./table:table-cell[1]/text:p/text() = preceding-sibling::table:table-row/table:table-cell[1]/text:p/text())]

0

纯XPath的应该是:

/table:table/table:*[not(
    .//text:p[1] 
    = preceding-sibling::table:table-row//text:p[1] 
)] 

如果预计输出你的意思table:row节点序列,而不是在XML文档中有人评论正确通知。

/table:table/table:*[not(
    ./table:*[1]//text:*[1] 
    = preceding-sibling::table:*/table:*[1]/text:*[1] 
)] 
+0

我不明白你的XPath表达式,但是这为我产生了一个额外的空节点。尽管如此,感谢代码和澄清。 – Aru

+0

@polishchuk回答更安全,因为绝对XPath可能有点慷慨。我已经给了你一个简短的(完全处理你的问题输入),它必须根据你对输入xml(和XPath :)的知识进行调整)。为了正确,我用一个更安全的XPath编辑了这个问题,它应该不那么一般,但更安全。 –

相关问题