、彼が望んでいる:
次の兄弟のすべての要素まで、は含まない、AP、UL、OL、またはBLOCKQUOTE要素
ない 最初の1
I. XPath 1.0のソリューション:指名手配されている
ノードが2 nodesetsの交差点です。
値'first'
とid
とp
の兄弟を、次のされているすべての要素。
hr
の兄弟より前のすべての要素。
は、XPath 1.0でこれを見つけるために、我々は、ノードセットの交差点ためKayessian式を使用:上記のXPath式がノードセットの両方に属しているすべてのノードを選択します。
$ns1[count(.|$ns2) = count($ns2)]
$ns1
とノードセット$ns2
に転送します。
$vP1
を/*/p[@id='first']
とします。
$vFirstNotInRange
であるみましょう:
$vP1/following-sibling::*
[not(self::p or self::ul
or self::ol or self::blockquote)
] [1]
これは、より正確に(この場合hr
に)最初の不要なノードを選択する、または:$vP1
の次の兄弟であり、それはp
ない最初の要素を、A ul
、ol
またはである。
その後、我々が交差したい2ノードセットが$vP1
次のすべての兄弟と$vFirstNotInRange
の先行するすべての兄弟である:
は、私たちは$vFollowingP1
で最初のノードセットを示すものと - これは、次のとおりです。
$vP1/following-sibling::*
そして、私たちは$vPreceedingNotInRange
を有する第2ノードセットを表してみましょう - これは、次のとおりです。
$vFirstNotInRange/preceding-sibling::*
最後に、Kayessinaの式$ns1
を$vPreceedingNotInRange
と$ns2
と$vFollowingP1
と置き換えます。これらの置換のreultは正確に希望のノードを選択します:
$vPreceedingNotInRange
[count(.|$vFollowingP1)
=
count($vFollowingP1)
]
我々はすべての変数が含まれていない表現を取得するまで、我々はすべての変数を置き換えた場合、我々が得る:
/*/p[@id='first']/following-sibling::*
[not(self::p or self::ul
or self::ol or self::blockquote
)
] [1]
/preceding-sibling::*
[count(.| /*/p[@id='first']/following-sibling::*)
=
count(/*/p[@id='first']/following-sibling::*)
]
この表現は正確に選択し、所望のノード。であるために補正し包ま - この変換は、以下のXML文書(設けられた非整形式XMLフラグメントに適用する場合
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="vP1" select="/*/p[@id='first']"/>
<xsl:variable name="vFirstNotInRange" select=
"$vP1/following-sibling::*
[not(self::p or self::ul
or self::ol or self::blockquote)
] [1]"/>
<xsl:variable name="vFollowingP1"
select="$vP1/following-sibling::*"/>
<xsl:variable name="vPreceedingNotInRange"
select="$vFirstNotInRange/preceding-sibling::*"/>
<xsl:template match="/">
<xsl:copy-of select=
"$vPreceedingNotInRange
[count(.|$vFollowingP1)
=
count($vFollowingP1)
]"/>
================
<xsl:copy-of select=
"/*/p[@id='first']/following-sibling::*
[not(self::p or self::ul
or self::ol or self::blockquote
)
] [1]
/preceding-sibling::*
[count(.| /*/p[@id='first']/following-sibling::*)
=
count(/*/p[@id='first']/following-sibling::*)
]
"/>
</xsl:template>
</xsl:stylesheet>
:基づく検証 - ここ
はXSLTであります
<html>
<h1>Header</h1>
<p>Paragraph 1</p>
<p id="first">Paragraph 2</p>
<p>Paragraph 3</p>
<ul>
<li>Item 1</li>
<li>Item 2</li>
</ul>
<p>Paragraph 4</p>
<hr/>
<p>Paragraph 5</p>
<blockquote>Blockquote 1</blockquote>
</html>
2つのXPath式(変数を1と置換すべての変数を持つ1)は、EVのとおりです。)WELLFORMED作らaluatedと希望、正しい選択されたノードの出力:
<p>Paragraph 3</p>
<ul>
<li>Item 1</li>
<li>Item 2</li>
</ul>
<p>Paragraph 4</p>
================
<p>Paragraph 3</p>
<ul>
<li>Item 1</li>
<li>Item 2</li>
</ul>
<p>Paragraph 4</p>
II。 XPath 2。0溶液:説明
<p>Paragraph 3</p>
<ul>
<li>Item 1</li>
<li>Item 2</li>
</ul>
<p>Paragraph 4</p>
:ここでは、XPath 2.0が "次" を使用
$vFirstNotInRange/preceding-sibling::*
[. >> $vP1]
これも$vP1
に従い、同じ所望のノードを選択している$vFirstNotInRange
の先行するいずれかの兄弟を選択します演算子>>
。
冗長で混乱します。例としてシンプルなXMLを提供し、正確にどのノードを選択するかを示してください。これらのノードのそれぞれが満たすべきルールを説明してください。 –
"p、ul、ol、またはblockquote要素ではない最初の要素を含むが、これを含まないすべての兄弟要素は冗長で混乱しますか? – Sean
質問を編集してください - 多くの人がコメントを読むことはできません。 –