2010-04-04 21 views
10

Lo que intento hacer es bastante simple, pero no puedo encontrar el camino para hacerlo. Solo quiero iterar sobre los hijos de un nodo excluyendo al primer hijo.Excluir al primer hijo con XSL-T

Por ejemplo, en este fragmento de XML, me gustaría que todos los <bar> elementos, excepto el primero:

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

No hay atributo común por el cual puedo filtrar (como una etiqueta id o algo similar)

¿Alguna sugerencia?

+0

Buena pregunta (+1). Ver mi respuesta para una solución completa. –

Respuesta

11

Siempre puede usar position junto con xsl:when.

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

... y me siento como un n00b. '' Gracias. – zneak

+0

@zneak - todos estábamos allí ... demasiadas cosas para mantener en nuestro cerebro al mismo tiempo. – Oded

+0

'node.position()! = 1' no es una expresión XPath sintácticamente correcta. –

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

Por ejemplo, en 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

Usando apply-templates:

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

o el mismo XPath para for-each:

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

/foo/bar[position() > 1]

selecciona todos bar elementos con la excepción de la primera, que son hijos del elemento superior, que es foo.

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

selecciona todos los elementos bar en en cualquier documento XML, con la excepción de la primera bar elemento en este documento.

+0

Ya veo. Gracias. :) – zneak

Cuestiones relacionadas