Ответ 1
Вы всегда можете использовать position
вместе с xsl:when
.
<xsl:when test="node[position() > 1]">
<!-- Do my stuff -->
</xsl:when>
То, что я пытаюсь сделать, довольно просто, но я не могу найти способ. Я просто хочу перебрать дочерние элементы node, исключая первый дочерний элемент.
Например, в этом фрагменте XML мне нужны все элементы <bar>
, кроме первого:
<foo>
<Bar>Example</Bar>
<Bar>This is an example</Bar>
<Bar>Another example</Bar>
<Bar>Bar</Bar>
</foo>
Нет общего атрибута, с помощью которого я могу фильтровать (например, тег id
или что-то подобное).
Любые предложения?
Вы всегда можете использовать position
вместе с xsl:when
.
<xsl:when test="node[position() > 1]">
<!-- Do my stuff -->
</xsl:when>
/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" }));
}
/foo/bar[position() > 1]
выбирает все элементы bar
, за исключением первого, которые являются дочерними элементами верхнего элемента, который является foo
.
(//bar)[position() >1]
выбирает все элементы bar
в любом XML-документе, за исключением первого элемента bar
в этом документе.
Использование apply-templates
:
<xsl:apply-templates select="foo/Bar[position() > 1]" />
или тот же xpath для for-each
:
<xsl:for-each select="foo/Bar[position() > 1]">
…
</xsl:for-each>