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

时间:2011-10-05 09:55:24

标签: 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>

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

3 个答案:

答案 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表达式的开头),因此/..将是根节点的父节点。

这没有意义。

除非它应该是./..:即。当前(上下文)节点的父节点。