2

following-sibling軸を機能させることができません。

私は次のようなXMLドキュメントを持っています。私はのようなものを試しましたname(/T/p/q/following-sibling::*[1]。セットの最初の結果だけになることはわかってnameいますが、その式は何も返しません。xmlstarletUbuntuでコマンドを使用してXPathを試しています。

<T>
<p><q>
<a1>A</a1>
<a2>A</a2>
<a3>A</a3>
<a4>A</a4>
<a5><b1>A</b1></a5>
</q></p>
</T>

として入力を指定すると/T/p/q、そのすべての子要素ノードの名前が必要ですが、そのレベルまでのみです。つまり、出力は次のようになります。

a1
a2
a3
a4
a5
4

2 に答える 2

2

XPath 1.0では、単一のXPath式/T/p/q/*を評価することによって、要素の子の必要なすべての名前を取得することはできません。

したがって、最初のステップですべての要素を選択する必要があります。

/T/p/q/*

次に、結果のXmlNodeListに含まれる要素ごとに、その要素から評価された新しいXPath式がその名前を生成します。

XPath 1.0のさまざまなホスティング言語を使用して、このアルゴリズムのさまざまな実装が可能です。

以下は、XPath1.0のホスティング言語がXSLT1.0である例です

<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="/">
  <xsl:variable name="vWanted" select="/T/p/q/*"/>

  <xsl:for-each select="$vWanted">
   <xsl:value-of select="name()"/> <xsl:text> </xsl:text>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

この変換が提供されたXMLドキュメントに適用される場合:

<T>
    <p><q>
    <a1>A</a1>
    <a2>A</a2>
    <a3>A</a3>
    <a4>A</a4>
    <a5><b1>A</b1></a5>
    </q></p>
</T>

アルゴリズムの2つのステップが実行され、必要な結果が生成されます。

a1 a2 a3 a4 a5 

II。単一のXPath2.0式-解決策:

/T/p/q/*/name()

上記のXPath2.0式を評価すると、5つの項目のシーケンスが生成されます。各項目は、異なる/T/p/q/*要素の名前です。

于 2012-06-25T13:13:25.647 に答える
1

実際、それはあなたが思っているよりずっと簡単です。

/T/p/q/*

のノードセットを返しますa1, a2, a3, a4, a5

の子であるq子であるすべての子を選択します。pTcontext node

そして、「子供たち」とは、「身近な子供たち」を意味します。「子孫」ではありません。したがって、a1-a5レベル上のノードのみが選択されます。

あなたが言ったように、name()関数はノードセットの最初のノードの名前だけを返します。すべての名前を単一の文字列として取得するには、ノードセットをトラバースする必要があると思います。


を使用してxmlstarlet、これを行うことができます。

xml sel -t -m "/T/p/q/*" -v "name(.)" -n input.xml

これはノードセットと一致し、その中のname(.)すべてのノードを呼び出し、その後改行を出力します。

  • -mXPath式に一致させる
  • -vXPath式によって返される値を出力します
  • -n改行の場合
  • 詳細はこちら

axisを使用するfollowing-siblingには、同じレベルにいる必要があります。たとえば、の後続のすべての兄弟を選択するにはa2、を使用します/T/p/q/a2/following-sibling::*。これはを返しa3, a4, a5ます。

于 2012-06-25T12:34:08.073 に答える