5

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

是否有必要/..在这里指定参数的值?

4

3 回答 3

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

结果是以下撒克逊错误消息(与其他 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="/.."/>

并再次运行转换

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

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

于 2011-10-05T12:22:36.667 回答
2

表达式/..选择根节点的父节点,保证不选择任何内容。

/指 XML 文档的根节点,它实际上是文档顶层的抽象概念,在 XPath 中用作引用顶层项的起点。它的子元素将始终包含文档元素,也可能包含顶层元素和comment()文档processing-instruction()元素的兄弟元素。

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

不,没有必要为xsl:param. 在这种情况下,它被用来明确定义这些参数的默认值为“无”。

于 2011-10-05T10:58:03.147 回答
0

/是根节点(当在 XPath 表达式的开头时),因此/..也是根节点的父节点。

这没有意义。

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

于 2011-10-05T10:02:36.647 回答