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 ドキュメントから新しい XML ドキュメントを作成することです。これは変換であり、XPath だけでは実行できません。XSLT は、XML ドキュメントの変換を実行するのに最も適した言語です。必要なドキュメントを XSLT で作成するのは簡単です。

XSLT ソリューションに興味がありますか? これが1つです:

<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 に答える