用XSL-T排除第一个孩子

时间:2010-04-04 15:40:08

标签: xslt xpath css-selectors

我想要做的事情相当简单,但我无法找到方法。我只想迭代除第一个孩子之外的节点的子节点。

例如,在这个XML片段中,我希望除了第一个元素之外的所有<bar>元素:

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

我没有可以过滤的常用属性(例如id标签或类似内容。)

有什么建议吗?

4 个答案:

答案 0 :(得分:11)

您始终可以将positionxsl: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>