2010-05-29 30 views
4

在我的情况,我有:XPATH:xml文件的选择子集

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

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

+0

好的问题(+1)。查看我的答案获得完整的解决方案。 – 2010-05-30 19:30:20

回答

2

当您尝试选择一个子元素时,只有这个将被返回。

6

,而不是选择你确实想元素,尝试排除的元素你不想

如果你只是使用XPATH,这将选择所有除book元素谁是@id元素不等于1(即<booklist><book id="1" /></booklist>)。

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

如果你想要一个XSLT解决方案,这个样式表有匹配所有没有@id="1"<book>元素,防止它们被复制到输出的一个空的模板。

其他所有内容(文档节点<booklist><book id="1">)将匹配向前复制的标识模板。

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

我正在面对java中xml签名中的xpath转换问题。 xpath转换似乎不会发生。你可以请看看这个问题 - http://stackoverflow.com/questions/10698287/xpath-transformation-not-working-in-java – Ashwin 2012-05-23 08:06:12

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>