2010-04-04 61 views
10

我想要做的事情很簡單,但我找不到方法。我只想遍歷不包括第一個孩子的節點的子節點。排除第一個孩子XSL-T

例如,在這個XML片段,我希望所有的<bar>元素,除了第一個:

<foo> 
    <Bar>Example</Bar> 
    <Bar>This is an example</Bar> 
    <Bar>Another example</Bar> 
    <Bar>Bar</Bar> 
</foo> 

沒有共同的屬性由我可以過濾(如一個id標籤或類似的東西)。

有什麼建議嗎?

+0

好問題(+1)。查看我的答案獲得完整的解決方案。 – 2010-04-04 17:21:26

回答

11

您可以隨時使用positionxsl:when

<xsl:when test="node[position() > 1]"> 
    <!-- Do my stuff --> 
</xsl:when> 
+0

...我覺得自己像一個n00b。 ' 1]」>'謝謝。 – zneak 2010-04-04 15:47:05

+0

@zneak - 我們都在那裏......在同一時間,我們的大腦中還有太多的東西存在。 – Oded 2010-04-04 15:49:41

+0

'node.position()!= 1'不是語法正確的XPath表達式。 – 2010-04-04 16:51:51

4
/foo/Bar[position() > 1] 

例如,在C#:

[Test] 
public void PositionBasedXPathExample() 
{ 
    string xml = @"<foo> 
        <Bar>A</Bar> 
        <Bar>B</Bar> 
        <Bar>C</Bar> 
        </foo>"; 

    XDocument xDocument = XDocument.Parse(xml); 
    var bars = xDocument.XPathSelectElements("/foo/Bar[position() > 1]") 
     .Select(element => element.Value); 

    Assert.That(bars, Is.EquivalentTo(new[] { "B", "C" })); 
} 
1

使用apply-templates

<xsl:apply-templates select="foo/Bar[position() > 1]" /> 

for-each相同的xpath:

<xsl:for-each select="foo/Bar[position() > 1]"> 
    … 
</xsl:for-each> 
3

/foo/bar[position() > 1]

選擇所有bar元件與所述第一的例外,那是頂部元件,這是foo的孩子。

(//bar)[position() >1]

選擇所有bar元件在任何XML文檔中,與第一bar元件的本文檔中的異常。

+0

我明白了。謝謝。 :) – zneak 2010-04-04 17:27:55