gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:30:42 28 4
gpt4 key购买 nike

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

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

最佳答案

的目的:

 <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="/.."/>

并再次运行转换

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

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

关于xslt - 在XSLT XPath中使用 '/..'表示法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7659545/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com