2

从以下 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 获得它?

编辑:如果我的描述和示例输出由于术语不佳而不匹配,则示例描述了我想要的内容。

4

3 回答 3

1

这应该返回所有包含英语的书籍:

/bookstore/book[.//@lang="eng"]

这本书的始祖是bookstore包含一切的。你确定你也想要它?

于 2012-08-22T13:25:39.077 回答
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>
于 2012-08-23T13:26:11.783 回答
0

您的描述与您的示例输出不完全匹配。我已经使用了您的示例:

/bookstore/book[./title/@lang='eng']/ancestor-or-self::*
|/bookstore/book[./title/@lang='eng']/descendant::*

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

于 2012-08-22T13:26:22.033 回答