Исключить первого ребенка с XSL-T - PullRequest
10 голосов
/ 04 апреля 2010

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

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

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

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

Есть предложения?

Ответы [ 4 ]

11 голосов
/ 04 апреля 2010

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

<xsl:when test="node[position() > 1]">
  <!-- Do my stuff -->
</xsl:when>
4 голосов
/ 04 апреля 2010
/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" }));
}
3 голосов
/ 04 апреля 2010

/foo/bar[position() > 1]

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

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

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

1 голос
/ 04 апреля 2010

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

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

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

<xsl:for-each select="foo/Bar[position() > 1]">
    …
</xsl:for-each>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...