2

ノード セット内の個別のノード (属性値に基づく) についてもう一度説明します。次の構造があるとします。

<struct>
  <a>
    <x id="1">a_1</x>
    <x id="2">a_2</x>
    <x id="3">a_3</x>
  </a>
  <b inherits="a">
    <x id="2">b_2</x>
  </b>
</struct>

<struct/><b/>には、同じ を継承するような複数の要素が含まれる場合があります<a/>。同時に、 のような複数の要素<a/>が許可されます。<a/>s とs の順序<b/>は任意です。継承は単一レベルの深さです。

質問: 特定のノードセットに対して次のノードセットを選択する単一のXPathを作成する方法<b/>:

<x id="1">a_1</x>
<x id="2">b_2</x>
<x id="3">a_3</x>

b_22 行目の値に注意してください。

これに対する解決策はありますか?

アップデート:

復元するXPathは次の形式にする必要がb[(magic_xpath)[@id=2]='b_2']あります。magic_xpath<x/><a/><b/>

実際の生活<struct/>は次のようになります。

<struct>
  <a>
    <x id="1">a_1</x>
    <x id="2">a_2</x>
    <x id="3">a_3</x>
  </a>
  <b inherits="a">
    <x id="2">I don't match resulting XPath</x>
  </b>
  <b inherits="a">
    <x id="2">b_2</x>
  </b>
</struct>
4

1 に答える 1

1

使用:

  $vB/x
 |
  /*/*[name() = $vB/@inherits]
                /x[not(@id = $vB/x/@id)]

where$vBは要素として定義されていbます。

これにより、すべての要素と、名前が の値である要素 ( の子) のb/xすべてのx子 (属性がどの属性idとも等しくない) の和集合が選択されます。b/x/@idstruct/*structb/@inherits

または、OP がコメントで要求したとおり -- 変数なし:

  /*/b/x
 |
  /*/*[name() = /*/b/@inherits]
                /x[not(@id = /*/b/x/@id)]

完全な XSLT ベースの検証:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
     <xsl:copy-of select=
     "/*/b/x
     |
      /*/*[name() = /*/b/@inherits]
                    /x[not(@id = /*/b/x/@id)]

   "/>
 </xsl:template>
</xsl:stylesheet>

この変換が、提供された (整形式になるように修正された) XML ドキュメントに適用された場合:

<struct>
    <a>
        <x id="1">a_1</x>
        <x id="2">a_2</x>
        <x id="3">a_3</x>
    </a>
    <b inherits="a">
        <x id="2">b_2</x>
    </b>
</struct>

単一の XPath 式が評価され、選択されたノードが出力されます

<x id="1">a_1</x>
<x id="3">a_3</x>
<x id="2">b_2</x>
于 2012-01-13T13:56:34.743 に答える