使用:
//dt[. = 'cat1']
/following-sibling::dd
[count(.| //dt[. = 'cat2']/preceding-sibling::dd)
=
count(//dt[. = 'cat2']/preceding-sibling::dd)
]
that //dt[. = 'cat1']
and //dt[. = 'cat2']
each select が 1 つの要素のみを選択する場合、上記の式は必要な 2 つのdd
要素を正確に選択します。
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=
"//dt[. = 'cat1']
/following-sibling::dd
[count(.| //dt[. = 'cat2']/preceding-sibling::dd)
=
count(//dt[. = 'cat2']/preceding-sibling::dd)
]
"/>
</xsl:template>
</xsl:stylesheet>
この変換が提供された XML ドキュメントに適用されると(最後の 2 つdd
の の値が変更されるため、目的の要素が確実に選択されていることがわかります):
<dl class="ismSummary ismHomeSummary">
<dt>cat1</dt>
<dd>value1</dd>
<dd>value2</dd>
<dt>cat2</dt>
<dd>value3</dd>
<dd>value4</dd>
</dl>
XPath 式が評価され、選択されたノードが出力にコピーされます。
<dd>value1</dd>
<dd>value2</dd>
説明:
ここでは、XPath 1.0のノード セットの交差に Kayessian 法を使用しています。
2 つのノードセットの交点:$ns1
と$ns2
は:
$ns1[count(.|$ns2) = count($ns2)]
$ns1
私たちの場合、次のように置き換えます。
//dt[. = 'cat1']/following-sibling::dd
$ns2
そして、次のように置き換えます。
//dt[. = 'cat2']/preceding-sibling::dd