Java XPATH:选择xml文件的子集

Java XPATH:选择xml文件的子集,java,xml,xslt,xpath,Java,Xml,Xslt,Xpath,就我而言,我有: <booklist> <book id="1"> </book> <book id="2"> </book> <book id="3"> </book> ...... </booklist> 但是我还需要document元素。 谢谢当您尝试选择子元素时,只会返回该子元素。不要选择您想要的元素,而是尝试排除您不想要的元素 如果您只是使用XPATH,

就我而言,我有:

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

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

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

  ......

</booklist>
但是我还需要document元素。
谢谢

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

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

如果您只是使用XPATH,这将选择除
书籍
元素以外的所有元素,这些元素的
@id
不等于1(即

如果需要XSLT解决方案,则此样式表有一个空模板,该模板匹配所有没有
@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>

我怎样才能返回:

<booklist>
  <book id="1">
  </book>
</booklist>
< 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>
<booklist>
   <book id="1"/>
</booklist>

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

<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>
<booklist>
   <book id="1"/>
</booklist>

好问题(+1)。关于完整的解决方案,请参阅我的答案。我在java中xml签名的xpath转换中面临一个问题。xpath转换似乎没有发生。你能看一下这个问题吗-