【问题标题】:Exclude first child with XSL-T使用 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)。请参阅我的答案以获得完整的解决方案。

标签: xslt xpath css-selectors


【解决方案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" }));
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-08
        • 2017-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多