<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])
?
答案 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.