这是一个初学者的问题.这个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>
Run Code Online (Sandbox Code Playgroud)
是否有必要/..在参数中指定值?
目的:
<xsl:param name="pFun" select="/.."/>
Run Code Online (Sandbox Code Playgroud)
是指定(至少在类型系统非常弱的XPath 1.0中)参数的类型$pFun是节点(或更一般地说是节点集).因此,读者知道为此参数传递的值不应该是字符串或整数.
它还指定默认值(如果在调用或应用模板时未明确指定此参数)是空节点集.
此表示法主要具有文档记录意义(但请参阅本答案末尾的更新),并且仅在类型系统较弱的XPath 1.0中有用.在XPath 2.0中,建议明确指定类型,以便XPath处理器可以执行更好的类型检查,并且生成的代码可以更加优化和高效.
因此,在XPath 2.0/XSLT 2.0(在这种特殊情况下)中,将上述内容重构为:
<xsl:param name="pFun" as="element()">
Run Code Online (Sandbox Code Playgroud)
这种符号还有其他变体.在@Michael Kay的早期书籍中,人们也可以找到如下表达式:
@comment()
Run Code Online (Sandbox Code Playgroud)
更新:表达式/..比仅用于文档目的具有更多实际用途.
<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>
Run Code Online (Sandbox Code Playgroud)
尝试将此转换应用于任何XML文档.在我们的例子中,最简单的可能:
<t/>
Run Code Online (Sandbox Code Playgroud)
结果是以下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
Run Code Online (Sandbox Code Playgroud)
现在替换:
<xsl:param name="pNode"/>
Run Code Online (Sandbox Code Playgroud)
用:
<xsl:param name="pNode" select="/.."/>
Run Code Online (Sandbox Code Playgroud)
并再次运行转换.
这次执行转换时没有运行时错误.
结论:指定空节点集的能力在实践中很重要,表达式/..是实现此目的的一种方法.