2010-04-04 9 views
10

Yapmaya çalıştığım şey oldukça basit, ancak yolu bulamıyorum. Sadece ilk çocuk hariç bir düğümün çocukları üzerinde yinelemek istiyorum.XSL-T ile ilk çocuğu hariç tut

Örneğin, bu XML ön bilgide ben ilki hariç tüm <bar> unsurları, isteyeyim:

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

Bir id etiketi veya benzeri bir şey gibi (filtrelemek için kullanılabilecek ortak bir özelliği yoktur).

Herhangi bir öneriniz var mı?

+0

İyi soru (+1). Tam bir çözüm için cevabımı görün. –

cevap

11

xsl:when ile birlikte position her zaman kullanabilirsiniz. C# Örneğin

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

... ve bir n00b gibi hissediyorum. '' Teşekkür ederim. – zneak

+0

@zneak - hepimiz oradaydık ... aynı zamanda beynimizde tutmak için çok fazla şey vardı. – Oded

+0

'node.position()! = 1 ', sözdizimsel olarak doğru bir XPath ifadesi değil. –

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

:

[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 kullanarak:

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

veya for-each aynı xpath:

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

/foo/bar[position() > 1]

foo olan üst eleman, çocukları ilk hariç tüm bar elemanları seçer.

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

bu belgede ilk bar elemanı hariç olmak üzere, herhangi bir XML belgesindeki tüm bar unsurları seçer.

+0

Anladım. Teşekkür ederim. :) – zneak