就我而言,我有:
<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 :(得分: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)
当您尝试选择子元素时,只会返回该元素。