この XPath 1.0 式は、必要なノードを正確に選択します。
/*/span[.='Heading4']
/following-sibling::text()
[count(.|/*/span[.='Heading5']/preceding-sibling::text())
=
count(/*/span[.='Heading5']/preceding-sibling::text())
]
[normalize-space()]
$ns1
これは、2 つのノードセットとの共通部分に対するよく知られた Kayessian 法から生成されます$ns2
。
$ns1[count(.|$ns2) = count($ns2)]
上記の最初の式は、Kayess 式に次の式を代入$ns1
すると得られます。
/*/span[.='Heading4']/following-sibling::text()
そして$ns2
:
/*/span[.='Heading5']/preceding-sibling::text()
最後の述語[normalize-space()]
は、この共通部分から空白のみのテキスト ノードを除外します。
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=
"/*/span[.='Heading4']
/following-sibling::text()
[count(.|/*/span[.='Heading5']/preceding-sibling::text())
=
count(/*/span[.='Heading5']/preceding-sibling::text())
]
[normalize-space()]
"/>
</xsl:template>
</xsl:stylesheet>
提供された XML ドキュメントにこの変換が適用されると(エンティティが置き換えられます -- 利用可能なエンティティを定義する DTD がなく、ここでは必須ではないため):
<html>
<span>Heading</span>
<br />
<br />
<span>Heading1</span>
<br /> data#1
<br />
<br />
<span>Heading4</span>
<br /> #acirc;#euro;#cent; data#4.1
<br /> #acirc;#euro;#cent; data#4.2
<br /> #acirc;#euro;#cent; data#4.3
<br /> #acirc;#euro;#cent; data#4.4
<br />
<br />
<span>Heading5</span>
<br /> #acirc;#euro;#cent; data#5.1
<br /> #acirc;#euro;#cent; data#5.2
<br /> #acirc;#euro;#cent; data#5.3
<br />
<br />
</html>
Xpath 式が評価され、この評価の結果が出力にコピーされます。
#acirc;#euro;#cent; data#4.1
#acirc;#euro;#cent; data#4.2
#acirc;#euro;#cent; data#4.3
#acirc;#euro;#cent; data#4.4