使用 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】:您始终可以将position
与xsl:when
一起使用。
<xsl:when test="node[position() > 1]">
<!-- Do my stuff -->
</xsl:when>
【讨论】:
... 我觉得自己像个 n00b。<for-each select="foo/Bar[position() > 1]">
谢谢。
@zneak - 我们都在那儿……太多东西不能同时留在我们的大脑中。
node.position() != 1
不是语法正确的 XPath 表达式。
答案仍然包含语法错误的 XPath 表达式!为什么不尝试运行代码并只发布正确的代码?
示例需要正确才能有用。我从不回复未经测试的代码。【参考方案3】:
/foo/bar[position() > 1]
选择除第一个元素之外的所有bar
元素,它是顶部元素的子元素,即foo
。
(//bar)[position() >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 排除第一个孩子的主要内容,如果未能解决你的问题,请参考以下文章