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

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

Например, в этом отрывке XML, я хотел бы весь <bar> элементы, кроме первого:

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

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

Какие-либо предложения?

11
задан zneak 4 April 2010 в 15:40
поделиться

4 ответа

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

<xsl:when test="node[position() > 1]">
  <!-- Do my stuff -->
</xsl:when>
12
ответ дан 3 December 2019 в 05:57
поделиться
/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" }));
}
4
ответ дан 3 December 2019 в 05:57
поделиться

/ foo / bar [position ()> 1]

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

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

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

3
ответ дан 3 December 2019 в 05:57
поделиться

Использование шаблонов приложений :

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

или то же самое xpath для для каждого :

<xsl:for-each select="foo/Bar[position() > 1]">
    …
</xsl:for-each>
1
ответ дан 3 December 2019 в 05:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: