I. XPath 1.0 では、2 つのノードセットの共通部分に Kayessian メソッドを使用します。
$ns1[count(.|$ns2) = count($ns2)]
これにより、2 つのノードセット$ns1
との交点が選択されます$ns2
。
これに置き換えます:
$ns1
と:
/*/*[@class='ac'][1]/following-sibling::*[@class='ac1']
と$ns2
: _
/*/*[@class='ac'][2]
/following-sibling::*[not(@class='ac1')][3]
/preceding-sibling::*
結果の XPath 式は次のとおりです。
/*/*[@class='ac'][4]
/following-sibling::*[@class='ac1']
[count(.
|
/*/*[@class='ac'][5]
/following-sibling::*[not(@class='ac1')][6]
/preceding-sibling::*
)
=
count(/*/*[@class='ac'][7]
/following-sibling::*[not(@class='ac1')][8]
/preceding-sibling::*
)
]
XSLT ベースの検証:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="ns1" select=
"/*/*[@class='ac'][9]/following-sibling::*[@class='ac1']"/>
<xsl:variable name="ns2" select=
"/*/*[@class='ac'][10]
/following-sibling::*[not(@class='ac1')][11]
/preceding-sibling::*"/>
<xsl:template match="/">
<xsl:copy-of select=
"$ns1[count(.|$ns2) = count($ns2)]"/>
=========
<xsl:copy-of select=
"/*/*[@class='ac'][12]
/following-sibling::*[@class='ac1']
[count(.
|
/*/*[@class='ac'][13]
/following-sibling::*[not(@class='ac1')][14]
/preceding-sibling::*
)
=
count(/*/*[@class='ac'][15]
/following-sibling::*[not(@class='ac1')][16]
/preceding-sibling::*
)
]
"/>
</xsl:template>
</xsl:stylesheet>
この変換が提供された XML ドキュメントに適用されると、次のようになります。
<container>
<item class="ac"/>
<item class="ac1"/>
<item class="ac1"/>
<item class="ac1"/>
<item class="ac"/>
<item class="ac1"/>
<item class="ac1"/>
<item class="ac2"/>
<item class="ac1"/>
<item class="ac"/>
<item class="ac1"/>
<item class="ac1"/>
<item class="ac1"/>
</container>
2 つの XPath 式 (1 つは変数を使用し、もう 1 つは変数を置換したもの) が評価され、それぞれによって選択されたノードが出力にコピーされます。
<item class="ac1"/>
<item class="ac1"/>
=========
<item class="ac1"/>
<item class="ac1"/>
Ⅱ.XPath 2.0 ソリューション:
intersect
同じ 2 つのノード セットで標準の XPath 2.0 演算子を使用するだけです。
または、標準の演算子<<
andを使用することもできます>>
。