2 回答

TA贡献1725条经验 获得超8个赞
当您使用 Saxon 9 时,您确实至少使用 XSLT 2 和 XPath 2,我建议在 XPath 中实现变量选择,例如
<xsl:variable name="testPath" select="if ($versionNo = '2') then /abc:Files/def:Description else /abc:Files/def:Names"/>
这样你的
<xsl:apply-templates select="$testPath/qwe:Test"/>
应该可以很好地处理qwe:Test
先前选择的一个def:Description
或多个元素的子def:Names
元素。
当然也可以使用例如
<xsl:apply-templates select="(if ($versionNo = '2') then /abc:Files/def:Description else /abc:Files/def:Names)/qwe:Test"/>
或者做例如
<xsl:apply-templates select="(/abc:Files/def:Description[$versionNo = '2'], /abc:Files/def:Names[$versionNo != '2'])/qwe:Test"/>

TA贡献1789条经验 获得超8个赞
我正在处理类似的问题。在我看来,变量可见性仅在<xsl:choose>块内,我可以建议您制作模板块并以这种方式调用它们:
<xsl:choose>
<xsl:when test="$versionNo = '2'" >
<xsl:call-template name="TemplateOne">
<xsl:with-param name="testPath" select="'/abc:Files/def:Description'" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="TemplateTwo">
<xsl:with-param name="testPath" select="'/abc:Files/def:Names'" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
模板定义为:
<xsl:template name="TemplateOne">
<xsl:param name="testPath" />
...
bla bla bla
remember to use variable in this template as "{$testPath}"
...
</xsl:template>
添加回答
举报