2010-04-04 11 views
10

Quello che sto cercando di fare è abbastanza semplice, ma non riesco a trovare la strada. Voglio solo scorrere i figli di un nodo escludendo il primo figlio.Escludi il primo figlio con XSL-T

Per esempio, in questo frammento XML, vorrei tutti i <bar> elementi, ad eccezione del primo:

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

Non v'è alcun attributo comune da cui posso filtrare (come un tag id o qualcosa di simile).

Qualche suggerimento?

+0

Buona domanda (+1). Vedi la mia risposta per una soluzione completa. –

risposta

11

È sempre possibile utilizzare position insieme a xsl:when.

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

... e mi sento un n00b. '' Grazie. – zneak

+0

@zneak - eravamo tutti lì ... troppe cose da tenere nel nostro cervello nello stesso tempo. – Oded

+0

'node.position()! = 1' non è un'espressione XPath sintatticamente corretta. –

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

Ad esempio, in 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

Utilizzando apply-templates:

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

o lo stesso XPath per for-each:

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

/foo/bar[position() > 1]

seleziona tutti bar elementi con l'eccezione del primo, che sono figli dell'elemento superiore, che è foo.

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

seleziona tutti bar elementi in qualsiasi documento XML, con l'eccezione del primo elemento bar in questo documento.

+0

Vedo. Grazie. :) – zneak

Problemi correlati