这个问题(以及我的问题)类似于XSLT1获取特定标记的第一个出现。。。但我有一个"未定义变量"错误。
我有一个具有refpos
属性的XML,它可以由第一个XSLT 生成
<xsl:template match="p[@class='ref']">
<xsl:copy>
<xsl:attribute name="refpos">
<xsl:value-of select="position()"/>
</xsl:attribute>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()" name="idt">
<xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
</xsl:template>
然后,我有一个主要的(第二个)XSLT,
<xsl:variable name="firstRef">
<xsl:value-of select="(//p[@class='ref'])[1]/@refpos"/>
</xsl:variable>
<xsl:template match="p[@refpos=$firstRef]">
<title><xsl:apply-templates /></title>
</xsl:template>
<xsl:template match="@*|node()" name="idt">
<xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
</xsl:template>
但是这个XSLT在这里不起作用!!
PS:我也相信XSLT1可以让我们一步到位。
XSLT1.0不允许在模板匹配表达式中引用变量(XSLT2.0允许)。您必须将检查从模板内的谓词移动:
<xsl:template match="p">
<xsl:choose>
<xsl:when test="@refpos=$firstRef">
<title><xsl:apply-templates /></title>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="idt" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>