xslt中的自轴

时间:2015-07-09 21:30:29

标签: xpath xslt-1.0

<element>
  <bye>do not delete me</bye>
  <hello>do not delete me</hello>
  <hello>delete me</hello>
  <hello>delete me</hello>
</element>

应用于上述xml,这会删除除hello的第一个/element子项以外的所有节点:

<xsl:template match="hello[not(current() = parent::element/hello[1])]" />

为什么这些不起作用? (假设第一个节点不是文本节点)

<xsl:template match="hello[not(self::hello/position() = 1)]" />
<xsl:template match="hello[not(./position() = 1)]" />

还是这个?

<xsl:template match="hello[not(self::hello[1])]" />

self轴的选择是什么?为什么这最后一个例子不等同于not(hello[1])

2 个答案:

答案 0 :(得分:2)

首先,当你这么说时,你错了:

  

这将删除除hello

的第一个/element子项以外的所有节点

事实是,它删除了hello /element<element> <hello>a</hello> <hello>b</hello> <hello>c</hello> <hello>a</hello> </element> 个孩子的<xsl:template match="hello[not(current() = parent::element/hello[1])]" /> 孩子,其价值与第一个孩子的价值不同。例如,给定:

<强> XML

hello

模板:

position()

将匹配第二个和第三个<xsl:template match="hello[not(self::hello/position() = 1)]" /> 节点 - 但不会匹配第一个或第四个

现在,关于您的问题:在XSLT 1.0中,hello[not(self::hello/position() = 1)]不是有效的位置步骤 - 所以这个:

hello

应该返回错误。

在XSLT 2.0中,模式<xsl:template match="hello[not(./position() = 1)]" /> 任何 ./position()元素不匹配 - 因为自身轴上只有一个节点,因此其位置始终为1

类似地:

.

在XSLT 1.0中无效。

在XSLT 2.0中,self::node()将始终返回1,原因与以前相同:<xsl:template match="hello[not(self::hello[1])]" /> def append_counts(colours): tally = {} result = [] colours.reverse() while colours: colour = colours.pop() tally[colour] = tally.get(colour, 0) + 1 result.append("%s%d" % (colour, tally[colour])) return result append_counts(['red', 'green', 'blue', 'yellow', 'red', 'red', 'black', 'blue', 'yellow']) 的缩写,并且只有一个此类节点。

最后,这个模板:

def append_counts(colours):
  def reducer((counts, hist), colour):
    hist[colour] = hist.get(colour, 0) + 1
    counts.append("%s%d" % (colour, hist[colour]))
    return counts, hist
  return reduce(reducer, colours, ([], {}))[0]

append_counts(['red', 'green', 'blue', 'yellow', 'red', 'red', 'black', 'blue', 'yellow'])

正在寻找一个没有(第一个实例)的节点。当然,不存在这样的节点。

答案 1 :(得分:2)

在“/”运算符的RHS上使用position()永远不会有用 - 在XSLT 1.0中,这是你问题的标记,实际上并不允许。

在XSLT 2.0中,表达式X / position()的结果是整数序列1..count(X)。如果LHS是单例,例如self :: E,则count(X)为1,因此结果为单个整数1.