这是初学者的问题。这个XPath表达式/..
是什么意思?它总是选择一个空节点集吗?
我注意到这种模式在FXSL库中被广泛使用,例如:
<xsl:template name="map">
<xsl:param name="pFun" select="/.."/>
<xsl:param name="pList1" select="/.."/>
<xsl:for-each select="$pList1">
<xsl:copy>
<xsl:apply-templates select="$pFun">
<xsl:with-param name="arg1" select="."/>
</xsl:apply-templates>
</xsl:copy>
</xsl:for-each>
</xsl:template>
是否有必要在参数'值中指定/..
?
答案 0 :(得分:5)
的目的:
<xsl:param name="pFun" select="/.."/>
指定(至少在类型系统非常弱的XPath 1.0中)参数$pFun
的类型是节点(或更一般地说是节点集)。因此,读者知道为此参数传递的值不应该是字符串或整数。
它还指定默认值,如果在调用或应用模板时未明确指定此参数,则为空节点集。
此表示法具有主要的文档重要性(但请参阅本答案末尾的更新),仅在类型系统较弱的XPath 1.0中有用。在XPath 2.0中,建议明确指定类型,以便XPath处理器可以执行更好的类型检查,并且生成的代码可以更加优化和高效。
因此,在XPath 2.0 / XSLT 2.0(在这种特殊情况下)中,将上述内容重构为:
<xsl:param name="pFun" as="element()">
此类符号还有其他变体。在@Michael Kay的早期书籍中,人们也可以找到如下表达式:
@comment()
更新:表达式/..
比仅用于文档目的更具实际用途。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:param name="pNode"/>
<xsl:copy-of select=".|$pNode"/>
</xsl:template>
</xsl:stylesheet>
尝试将此转换应用于任何XML文档。在我们的例子中,最简单的:
<t/>
结果是以下Saxon错误消息(与其他XSLT 1.0处理器类似的错误):
Error at xsl:copy-of on line 8 of file:/(Untitled):
The value is not a node-set
Transformation failed: Run-time errors were reported
现在替换:
<xsl:param name="pNode"/>
<强>与强>:
<xsl:param name="pNode" select="/.."/>
再次运行转换。
这次执行转换时没有运行时错误。
结论:指定空节点集的能力在实践中很重要,表达式/..
是实现此目的的一种方法。
答案 1 :(得分:2)
表达式/..
选择根节点的父节点,保证不选择任何内容。
/
指的是XML文档的根节点,它实际上是文档顶层的抽象概念,在XPath中用作引用顶级项的起点。它的子元素将始终包含document元素,并且还可能包含作为document元素的兄弟元素的顶级comment()
和processing-instruction()
。
是否有必要在参数'中指定/ ..?
不,没有必要为xsl:param
提供默认的select语句。在这种情况下,它被用于明确地将这些参数的默认值定义为“无”。
答案 2 :(得分:0)
/
是根节点(在XPath表达式的开头),因此/..
将是根节点的父节点。
这没有意义。
除非它应该是./..
:即。当前(上下文)节点的父节点。