来自以下xml文件:
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>
<book>
<title lang="de">Vom Winde verweht</title>
<price>39.95</price>
</book>
</bookstore>
我希望所有书籍都有lang =“eng”和他们的祖先节点,即以下输出:
<bookstore>
<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>
</bookstore>
如何使用XPath获取此内容?
编辑:如果我的说明和示例输出由于术语不当而不匹配,则样本会描述我想要的内容。
答案 0 :(得分:1)
这应该归还所有在内部有英语的书籍:
/bookstore/book[.//@lang="eng"]
这本书的祖先是bookstore
,其中包含所有内容。你确定你也想要它吗?
答案 1 :(得分:1)
XPath是一种基于XML文档的查询语言。
因此,作为评估XPath表达式的结果,不可能改变现有文档或创建新文档/节点。
您要求的是从当前文档创建新的XML文档 - 这是转换,不能单独在XPath中完成。 XSLT是一种最适合执行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(title/@lang = 'eng')]"/>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<bookstore>
<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>
<book>
<title lang="de">Vom Winde verweht</title>
<price>39.95</price>
</book>
</bookstore>
产生了想要的正确结果:
<bookstore>
<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>
</bookstore>
答案 2 :(得分:0)
您的描述与您的示例输出不完全匹配。我和你的样品一起去了:
/bookstore/book[./title/@lang='eng']/ancestor-or-self::*
|/bookstore/book[./title/@lang='eng']/descendant::*
书+祖先和书后代的结合。