我需要输出2种元素的属性。 我只想使用带有一个参数的1个模板来减少代码。
XML就像:
<myElement attribute1="x" attribute2="y" />
我想这样调用模板:
<xsl:apply-templates select="myElement">
<xsl:with-param name="paramAttr" select="@attribute1" />
</xsl:apply-templates>
和
<xsl:apply-templates select="myElement">
<xsl:with-param name="paramAttr" select="@attribute2" />
</xsl:apply-templates>
问题出在模板的定义中:
<xsl:template match="myElement">
<xsl:param name="paramAttr"/>
<xsl:value-of select="$paramAttr" /> <!-- NOT ACCEPTED -->
</xsl:template>
我尝试了不同的操作,例如在不同的地方使用concat()或{}引入@,但没有成功。 任何想法 ?谢谢。
答案 0 :(得分:1)
将属性名称作为字符串传递:
<xsl:apply-templates select="myElement">
<xsl:with-param name="paramAttr" select="'attribute1'" />
</xsl:apply-templates>
,然后在调用的模板中根据其名称选择属性:
<xsl:template match="myElement">
<xsl:param name="paramAttr"/>
<xsl:value-of select="@*[name() = $paramAttr]" />
</xsl:template>
答案 1 :(得分:0)
您还没有真正解释当前方法所发生的问题,但是我认为这是由xsl:with-param
的评估规则引起的,如果您查看https://www.w3.org/TR/xslt-10/#element-with-param时会说
用于计算值的当前节点和当前节点列表 xsl:with-param元素指定的内容与用于 xsl:apply-templates或xsl:call-template元素 发生
XSLT 3在https://www.w3.org/TR/xslt-30/#element-with-param中分别定义
用于计算xsl:with-param指定的值的焦点 元素与其父指令使用的元素相同。
这意味着,如果xsl:apply-templates
的外部上下文/焦点有一个myElement
的孩子(您为apply-templates
选择了,则在xsl:with-param
中,您需要使用{{ 1}}“ />,因为<xsl:with-param name="paramAttr" select="myElement/@attribute1
不会更改其内部xsl:apply-templates
的上下文/焦点。当然,请使用带有例如
xsl:with-param
可以使该方法更短并且更具可读性。如果有多个 <xsl:variable name="el" select="myElement"/>
<xsl:apply-templates select="$el">
<xsl:with-param name="paramAttr" select="$el/@attribute1"/>
</xsl:apply-templates>
元素,则最好使用
myElement
或首先将<xsl:for-each select="myElement">
<xsl:apply-templates select=".">
<xsl:with-param name="paramAttr" select="@attribute1"/>
</xsl:apply-templates>
</xsl:for-each>
元素推入模板,然后在其中进一步处理属性。