使用xsl:param在xsl:template中选择属性

时间:2018-11-08 20:58:04

标签: xml xslt

我需要输出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()或{}引入@,但没有成功。 任何想法 ?谢谢。

2 个答案:

答案 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> 元素推入模板,然后在其中进一步处理属性。