Исключить первого ребенка с XSL-T

То, что я пытаюсь сделать, довольно просто, но я не могу найти способ. Я просто хочу перебрать дочерние элементы node, исключая первый дочерний элемент.

Например, в этом фрагменте XML мне нужны все элементы <bar>, кроме первого:

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

Нет общего атрибута, с помощью которого я могу фильтровать (например, тег id или что-то подобное).

Любые предложения?

Ответ 1

Вы всегда можете использовать position вместе с xsl:when.

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

Ответ 2

/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" }));
}

Ответ 3

/foo/bar[position() > 1]

выбирает все элементы bar, за исключением первого, которые являются дочерними элементами верхнего элемента, который является foo.

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

выбирает все элементы bar в любом XML-документе, за исключением первого элемента bar в этом документе.

Ответ 4

Использование apply-templates:

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

или тот же xpath для for-each:

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