3

XPath で再帰的 AND 条件付き選択を使用するにはどうすればよいですか?

たとえば、次のドキュメントがあるとします。

<root xmlns:foo="http://www.foo.org/" xmlns:bar="http://www.bar.org">
  <file name="foo.mp4">
    <chunks>
      <file>
        <chunks>
          <file>
          <chunks>
            <file>1</file>
            <file>2</file>
            <file>3</file>
            <file>4</file>
          </chunks>
          </file>
          <file>
          <chunks>
            <file>5</file>
            <file>6</file>
            <file>7</file>
            <file>8</file>
          </chunks>
          </file>
        </chunks>
      </file>
      <file>
        <chunks>
          <file>
          <chunks>
            <file>9</file>
            <file>10</file>
            <file>11</file>
            <file>12</file>
          </chunks>
          </file>
          <file>
          <chunks>
            <file>13</file>
            <file>14</file>
            <file>15</file>
            <file>16</file>
          </chunks>
          </file>
        </chunks>
      </file>
    </chunks>
  </file>
</root>

私はちょうど選択したい:

<file>1</file>
<file>2</file>
<file>3</file>
<file>4</file>

したがって、効果的にこれ:

//[name="foo.mp4"]/chunks/*[1]/chunks/*[1]/*

しかし、一般化されたアプローチ、つまり、さらに深くネストされたオブジェクトをカバーするものを使用します。このようなもの:

//[name="foo.mp4"]/(chunks/*[1]/)+/*

(cond)+XPath構文ではなく、私が望むものの正規表現のような表現です。

4

2 に答える 2

2

私の知る限り、再帰的な XPath などはありません。したがって、再帰を実行できるようにするには、XPath を XSLT やプログラミング言語などの他のものと組み合わせる必要があります。純粋な XPath を使用する場合、可能であれば、要件を別の方法で定式化する必要があります。

これが実際のデータに当てはまるかどうかはわかりませんが、次のような要件を定式化できる場合は、次のようになります。

「内で、を含む最初のもの、つまり要素を含まず、テキストノードのみを含む要素をfile[@name='foo.mp4']見つけ、要素を返します」<chunk> <file><file> <file>

次に、純粋な XPath ソリューションの可能性があります。

(//file[@name='foo.mp4']//chunks[not(file/*)])[1]/file

問題のサンプル XML を指定するとfile、テスト時に上記の XPath 式によって 1 から 4 の期待される出力が返されhereます。

于 2016-02-21T00:21:34.237 に答える