我想要做的事情相当简单,但我无法找到方法。我只想迭代除第一个孩子之外的节点的子节点。
例如,在这个XML片段中,我希望除了第一个元素之外的所有<bar>
元素:
<foo>
<Bar>Example</Bar>
<Bar>This is an example</Bar>
<Bar>Another example</Bar>
<Bar>Bar</Bar>
</foo>
我没有可以过滤的常用属性(例如id
标签或类似内容。)
有什么建议吗?
答案 0 :(得分:11)
您始终可以将position
与xsl:when
一起使用。
<xsl:when test="node[position() > 1]">
<!-- Do my stuff -->
</xsl:when>
答案 1 :(得分:4)
/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" }));
}
答案 2 :(得分:3)
<强> /foo/bar[position() > 1]
强>
选择除第一个元素之外的所有bar
元素,这些元素是顶部元素的子元素,即foo
。
<强> (//bar)[position() >1]
强>
选择任何XML文档中的所有bar
元素,但本文档中的第一个bar
元素除外。
答案 3 :(得分:1)
使用apply-templates
:
<xsl:apply-templates select="foo/Bar[position() > 1]" />
或for-each
的相同xpath:
<xsl:for-each select="foo/Bar[position() > 1]">
…
</xsl:for-each>