XPath:获取某些节点和祖先

时间:2012-08-22 13:16:40

标签: xslt xpath

来自以下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获取此内容?

编辑:如果我的说明和示例输出由于术语不当而不匹配,则样本会描述我想要的内容。

3 个答案:

答案 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::*

书+祖先和书后代的结合。