由於OP解釋,他想:
以下所有兄弟元素最多,但不包括,這不是AP,UL,OL,或BLOCKQUOTE元素
的 第一個
I.的XPath 1.0溶液:
所希望的節點是兩個節點集的交集:
被繼p
與id
的兄弟姐妹值'first'
所有元素。
所有在hr
之前的兄弟姐妹的元素。
要使用XPath 1.0找到此我們使用Kayessian公式節點集相交:
$ns1[count(.|$ns2) = count($ns2)]
以上的XPath表達式選擇屬於同時向節點集的所有節點$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
第一元件,一個ul
,ol
或。
然後,我們要交兩個節點集都是下面的$vP1
兄弟姐妹的$vFirstNotInRange
所有前面的兄弟姐妹:
讓我們$vFollowingP1
表示第一個節點集合 - 這就是:
$vP1/following-sibling::*
讓我們與$vPreceedingNotInRange
表示第二節點集合 - 這就是:
$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::*)
]
這種表達準確選擇想要的節點。
下面是一個XSLT - 基於驗證:
<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>
當施加這種轉變在下面的XML文檔(所提供的非簡潔(wellformed)XML片段 - 校正,並且包裹在爲了造簡潔(wellformed)):
<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>
兩個XPath表達式(一個變量和一個與取代的所有變量)是EV 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溶液:
$vFirstNotInRange/preceding-sibling::*
[. >> $vP1]
這將選擇的$vFirstNotInRange
前述任一兄弟,其也下列$vP1
和選擇相同的通緝節點:
<p>Paragraph 3</p>
<ul>
<li>Item 1</li>
<li>Item 2</li>
</ul>
<p>Paragraph 4</p>
說明:在這裏,我們使用XPath 2.0 「跟隨」運營商>>
。
冗長而混亂。請提供一個簡單的XML作爲示例,並指出您要選擇哪些節點 - 解釋每個節點必須滿足的規則。 「 – 2012-02-10 14:12:29
」以下所有的兄弟元素,但不包括第一個不是p,ul,ol或blockquote元素的兄弟元素「是冗長而混亂的? – Sean 2012-02-11 21:00:54
請編輯問題 - 沒有多少人會閱讀評論。 – 2012-02-12 00:06:33