是不是不能使用模板的参数
同一模板的匹配 XPath 表达式!?
不可以,当选择模板执行时,模板匹配表达式中的任何变量/参数都必须在范围内(定义/可见)。
由于模板是 XSLT 指令(在全局级别定义),因此范围内(它们可以看到)的唯一变量/参数是全局级别变量/参数。
模板的参数仅在选择执行模板之后才会传递给它,而不是在此之前。这意味着在执行模板选择过程时,该参数的值不存在。
因此,如果要在执行过程的模板选择中使用非全局表达式,则需要在select
对应的属性xsl:apply-templates
指令,可以在其中计算该表达式——而不是在match
模板的属性,其中无法计算此表达式。
为了清楚起见,下面的代码纠正了所提供代码中的问题:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="myRoot">
<xsl:apply-templates select="myNode[@myAttribute = max(../myNode/@myAttribute)]">
<xsl:sort select="@myAttribute" />
</xsl:apply-templates>
</xsl:template>
<xsl:template match="myNode[node()]">
<xsl:for-each select="myChildAttribute">
INSERT INTO a(b) VALUES ('<xsl:value-of select="@myChildAttribute" />');
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
当此转换应用于提供的 XML 文档时:
<myRoot>
<myNode myAttribute="3">
<myChildAttribute myChildAttribute="a" />
</myNode>
<myNode myAttribute="2">
<myChildAttribute myChildAttribute="b" />
</myNode>
<myNode myAttribute="1" />
</myRoot>
没有产生错误,这是转换的输出(我不能说“正确的输出”,因为没有定义任何要求,因此无法验证它们。而且我对此代码持保留态度:例如使用<xsl:sort>
的孩子xsl:apply-templates
没有意义,因为它将对相等( max() )值进行排序,并且对相等值序列进行排序会产生相同的序列):
INSERT INTO a(b) VALUES ('a');