使用:
(//h2[span/@id='Neo'])[1]/following-sibling::ul
[count(.
|
(//h2[span/@id='Neo'])[1]
/following-sibling::h2[1]
/preceding-sibling::ul
)
=
count((//h2[span/@id='Neo'])[1]
/following-sibling::h2[1]
/preceding-sibling::ul
)
]
/li
これにより、値が「Neo」の属性を持つ子を持つ最初li
の直後に続くすべてが選択されます。h2
span
id
2番目のそのようなのqoutatationsを選択するh2
には、上記の式1
を。に置き換えるだけ2
です。
すべての番号に対してこれを行います。1,2, ..., count(//h2[span/@id='Neo'])
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=
"(//h2[span/@id='Neo'])[1]/following-sibling::ul
[count(.
|
(//h2[span/@id='Neo'])[1]
/following-sibling::h2[1]
/preceding-sibling::ul
)
=
count((//h2[span/@id='Neo'])[1]
/following-sibling::h2[1]
/preceding-sibling::ul
)
]
/li
"/>
</xsl:template>
</xsl:stylesheet>
この変換が提供されたXMLドキュメントに適用される場合:
<html>
<h2><span class="mw-headline" id="Neo">Neo</span></h2>
<ul>
<li> First quote </li>
</ul>
<ul>
<li> Second quote </li>
</ul>
<h2><span class="mw-headline" id="dont wanna this">Useless</span></h2> >
</html>
XPath式が評価され、選択したノードが出力にコピーされます。
<li> First quote </li>
<li> Second quote </li>
説明:
これは、2つのノードセットの共通部分のKayessian(Dr. Michael Kayによる)式から得られます。
$ns1[count(.|$ns2) = count($ns2)]
$ns
上記は、ノードセットとノードセットの両方に属するすべてのノードを正確に選択します$ns2
。
したがって、関心のある後続のすべての兄弟で$ns1
構成されるノードセットに置き換えます。対象の兄弟の直後(最初)の兄弟である、の先行するすべての兄弟で構成されるノードセットに置き換えます。ul
h2
$ns2
ul
h2
h2
これらの2つのノードセットの共通部分には、必要なすべてのul
要素が含まれています。
更新:コメントの中で、OPは、最初のセクションからの結果を望んでいることだけを知っていると述べています。文字列「Neo」は不明です。
これが修正された解決策です:
(//h2[span/@id=$vSectionId])[1]
/following-sibling::ul
[count(.
|
(//h2[span/@id=$vSectionId])[1]
/following-sibling::h2[1]
/preceding-sibling::ul
)
=
count((//h2[span/@id=$vSectionId])[1]
/following-sibling::h2[1]
/preceding-sibling::ul
)
]
/li
変数$vSectionId
は、次のXPath式の文字列値として取得する必要があります。
substring(//div[h2='Contents']
/following-sibling::ul[1]
/li[1]/a/@href,
2)
ここでは、最初の目次エントリのから必要なものを取得し、最初の文字「#」をスキップしていid
ます。href
a
これも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="vSectionId" select=
"substring(//div[h2='Contents']
/following-sibling::ul[1]
/li[1]/a/@href,
2)
"/>
<xsl:template match="/">
<xsl:copy-of select=
"(//h2[span/@id=$vSectionId])[1]
/following-sibling::ul
[count(.
|
(//h2[span/@id=$vSectionId])[1]
/following-sibling::h2[1]
/preceding-sibling::ul
)
=
count((//h2[span/@id=$vSectionId])[1]
/following-sibling::h2[1]
/preceding-sibling::ul
)
]
/li
"/>
</xsl:template>
</xsl:stylesheet>
この変換が
http://en.wikiquote.org/wiki/The_Matrixにある完全なXMLドキュメントに適用されると、これら2つのXPath式を適用した結果(最初の結果を2番目の結果に置き換えてから、 2番目の式)は必要な正しいものです:
<li>I know you're out there. I can feel you now. I know that you're afraid. You're afraid of us. You're afraid of change. I don't know the future. I didn't come here to tell you how this is going to end. I came here to tell you how it's going to begin. I'm going to hang up this phone, and then I'm going to show these people what you don't want them to see. I'm going to show them a world … without you. A world without rules and controls, without borders or boundaries; a world where anything is possible. Where we go from there is a choice I leave to you.</li>
<li>Whoa.</li>
<li>I know kung-fu.</li>
<li>Yeah. Well, that sounds like a pretty good deal. But I think I may have a better one. How about, I give you the finger [He does] and you give me my phone call.</li>
<li>Guns.. lots of guns...</li>
<li>There is no spoon.</li>
<li>My name...is Neo!</li>