使用 XSL-T 排除第一个孩子

Posted

技术标签:

【中文标题】使用 XSL-T 排除第一个孩子【英文标题】:Exclude first child with XSL-T 【发布时间】:2011-02-04 05:17:02 【问题描述】:

我正在尝试做的事情相当简单,但我找不到方法。我只想遍历一个节点的子节点,不包括第一个子节点。

例如,在这个 XML sn-p 中,我想要所有 <bar> 元素,除了第一个元素:

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

没有可以用来过滤的通用属性(例如 id 标记或类似标记)。

有什么建议吗?

【问题讨论】:

好问题 (+1)。请参阅我的答案以获得完整的解决方案。 【参考方案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>

【讨论】:

【参考方案2】:

您始终可以将positionxsl:when 一起使用。

<xsl:when test="node[position() > 1]">
  <!-- Do my stuff -->
</xsl:when>

【讨论】:

... 我觉得自己像个 n00b。 &lt;for-each select="foo/Bar[position() &gt; 1]"&gt; 谢谢。 @zneak - 我们都在那儿……太多东西不能同时留在我们的大脑中。 node.position() != 1 不是语法正确的 XPath 表达式。 答案仍然包含语法错误的 XPath 表达式!为什么不尝试运行代码并只发布正确的代码? 示例需要正确才能有用。我从不回复未经测试的代码。【参考方案3】:

/foo/bar[position() &gt; 1]

选择除第一个元素之外的所有bar 元素,它是顶部元素的子元素,即foo

(//bar)[position() &gt;1]

选择任何 XML 文档中的所有 bar 元素,但此文档中的第一个 bar 元素除外。

【讨论】:

【参考方案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" ));

【讨论】:

以上是关于使用 XSL-T 排除第一个孩子的主要内容,如果未能解决你的问题,请参考以下文章

WPF Dockpanel 第一个孩子使用剩余空间

如何检查元素是不是不是第一个孩子?

如何使用 CSS 获得特定数字的孩子?

使用谷歌地图时作为未定义的第一个孩子出现错误

使用 jQuery 获取第二个孩子

CSS第一个孩子悬停在一个元素上