XPATH:选择xml文件的子集

时间:2010-05-29 12:46:47

标签: java xml xslt xpath

就我而言,我有:

<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>

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

3 个答案:

答案 0 :(得分:6)

不要选择 想要 的元素,而是尝试排除 您不想要的元素

如果您只是使用XPATH ,则会选择除book元素之外的所有元素@id不等于1(即<booklist><book id="1" /></booklist> })。

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

如果您需要XSLT解决方案,此样式表有一个空模板,该模板匹配所有没有<book>的{​​{1}}元素,这样就无法复制它们进入输出。

其他所有内容(文档节点@id="1"<booklist>)将与身份模板匹配,后者会向前复制。

<book id="1">

答案 1 :(得分:3)

  

我怎么才能回来:

< 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>

答案 2 :(得分:2)

当您尝试选择子元素时,只会返回该元素。