【问题标题】:XPATH: select subset of xml fileXPATH:选择 xml 文件的子集
【发布时间】:2010-05-29 12:46:46
【问题描述】:

就我而言,我有:

<booklist>
  <book id="1">
  </book>

  <book id="2">
  </book>

  <book id="3">
  </book>

  ......

</booklist>

我怎样才能返回:

<booklist>
  <book id="1">
  </book>
</booklist>

如果我用/booklist/book[@id=1],我只能得到

<book id="1">
</book>

但我还需要文档元素。 谢谢

【问题讨论】:

  • 好问题 (+1)。请参阅我的答案以获得完整的解决方案。

标签: java xml xslt xpath


【解决方案1】:

与其选择您想要的元素,不如尝试排除您不想要的元素

如果您只是使用 XPATH,这将选择除 book 元素之外的所有元素,这些元素的 @id 不等于 1(即 &lt;booklist&gt;&lt;book id="1" /&gt;&lt;/booklist&gt;)。

//*[not(self::book[@id!='1'])]

如果您需要 XSLT 解决方案,此样式表有一个空模板,它匹配所有不包含 @id="1"&lt;book&gt; 元素,从而防止它们被复制到输出中。

其他所有内容(文档节点 &lt;booklist&gt;&lt;book id="1"&gt;)都将匹配身份模板,该模板向前复制。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <!--Empty template to prevent book elements
        that do not have @id="1" from being
        copied into the output -->
    <xsl:template match="book[@id!='1']" />

    <!--identity template to copy all nodes and attributes to output -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

【讨论】:

【解决方案2】:

我怎样才能返回:

< booklist >
< book id=1 >
< /book >
< /booklist >

XPath 是一种查询语言。评估 XPath 表达式不能更改 XML 文档的结构。

这就是为什么答案是:不,使用 XPath 这是不可能的

当您想要转换一个 XML 文档(这里就是这种情况)时,最好的解决方案可能是使用 XSLT——一种专为处理和转换树形结构而设计的语言数据。

这是一个非常简单的 XSLT 解决方案

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="book[not(@id=1)]"/>
</xsl:stylesheet>

将此转换应用于提供的 XML 文件时,会产生所需的正确结果

<booklist>
   <book id="1"/>
</booklist>

【讨论】:

    【解决方案3】:

    当你尝试选择一个子元素时,只会返回这个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多