首页 文章

XPath:获取某些节点和祖先

提问于
浏览
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获取此信息?

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

3 回答

  • 1

    这应该返回所有内部英语的书籍:

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

    这本书的祖先是包含一切的 bookstore . 你确定你也想要它吗?

  • 0

    XPath is a query language over XML documents .

    因此,作为评估XPath表达式的结果,不可能改变现有文档或创建新文档/节点 .

    您要求的是从当前文档创建一个新的XML文档 - 这是一个转换,不能单独在XPath中完成 . XSLT是一种最适合执行XML文档转换的语言 . 使用XSLT生成所需文档是微不足道的 .

    Are you interested in an XSLT solution? Here is one

    <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>
    

    When this transformation is applied on the provided XML document:

    <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>
    

    the wanted, correct result is produced:

    <bookstore>
       <book>
          <title lang="eng">Harry Potter</title>
          <price>29.99</price>
       </book>
    </bookstore>
    
  • 1

    您的描述与您的示例输出不完全匹配 . 我和你的样本一起去了:

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

    书籍祖先和书籍后代的联合 .

相关问题