【问题标题】:Select elements with unique values选择具有唯一值的元素
【发布时间】:2011-07-01 11:49:49
【问题描述】:

我正在尝试解析 OpenOffice 电子表格以获取第一列中具有唯一值的行。

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

    <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 做到这一点?

【问题讨论】:

  • XPath 只是一个表达式,用于获取您的 dom 的已定义 Elemente|Attribute|Node。您想要将您的初始 XML 文件转换为另一个文件。您可以通过使用 XSLT,然后使用 XSLT 使用 XPath 表达式来做到这一点。
  • 我想得到 Nodes,没想到我也能得到 XML。谢谢。

标签: xml xpath xpath-2.0


【解决方案1】:

此 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())]

【讨论】:

    【解决方案2】:

    纯 XPath 应该是:

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

    如果预期输出是指table:row 节点序列,而不是在 cmets 中正确注意到的 xml 文档

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

    【讨论】:

    • 我不理解您的 XPath 表达式,但这会为我产生一个额外的空节点。感谢您的代码和澄清。
    • @polishchuk 答案更安全,因为绝对 XPath 可能有点冗长。我给了你一个简短的(完美地处理你的问题输入),它必须根据你对输入 xml(和 XPath :) 的知识进行调整。只是为了正确起见,我用更安全的 XPath 编辑了这个问题,它应该不太通用,但更安全。
    猜你喜欢
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 2013-10-14
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 2021-07-08
    相关资源
    最近更新 更多