在XSLT XPath中使用'/ ..'表示法

Gar*_*art 5 xslt xpath fxsl

这是一个初学者的问题.这个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)

是否有必要/..在参数中指定值?

Dim*_*hev 5

目的:

 <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)

并再次运行转换.

这次执行转换时没有运行时错误.

结论:指定空节点集的能力在实践中很重要,表达式/..是实现此目的的一种方法.