XSLT - 有没有办法追加添加了<xsl:attribute>的属性?</xsl:attribute>

时间:2013-09-27 08:16:51

标签: xml xslt

简化示例:

<xsl:template name="helper">
  <xsl:attribute name="myattr">first calculated value</xsl:attribute>
</xsl:template>

<xsl:template match="/>
  <myelem>
    <xsl:call-template name="helper" />
    <xsl:attribute name="myattr">second calculated value</xsl:attribute>
  </myelem>
</xsl:template>

是否有某种方法可以让第二个将第二个计算值附加到结果节点中相同的myattr属性?

我已经看到如果目标属性在源xml中,可以使用属性值模板,但是我可以以某种方式引用我之前附加到结果节点的属性的值吗?

提前致谢!

4 个答案:

答案 0 :(得分:4)

您可以采取的一种方法是在辅助模板中添加一个参数,并将其附加到属性值。

<xsl:template name="helper">
  <xsl:param name="extra" />
  <xsl:attribute name="myattr">first calculated value<xsl:value-of select="$extra" /></xsl:attribute>
</xsl:template>

然后您可以将第二个计算值作为参数

过去
<xsl:template match="/>
  <myelem>
    <xsl:call-template name="helper">
      <xsl:with-param name="extra">second calculated value</xsl:with-param>
    </xsl:call-template>
  </myelem>
</xsl:template>

您不必为每次通话设置参数。如果您不想要任何附加内容,只需调用没有参数的帮助模板,并且不会将任何内容附加到第一个计算值。

答案 1 :(得分:2)

最简单的方法是稍微更改嵌套 - 让helper只生成文本节点并将<xsl:attribute>放入调用模板中:

<xsl:template name="helper">
  <xsl:text>first calculated value</xsl:text>
</xsl:template>

<xsl:template match="/>
  <myelem>
    <xsl:attribute name="myattr">
      <xsl:call-template name="helper" />
      <xsl:text>second calculated value</xsl:text>
    </xsl:attribute>
  </myelem>
</xsl:template>

这会将myattr设置为“第一个计算出的第二个计算值” - 如果你想要一个“值”和“秒”之间的空格,你必须在<xsl:text>元素中包含一个<{1}}元素

      <xsl:text> second calculated value</xsl:text>

答案 2 :(得分:0)

试试这个:

  <xsl:template name="helper">
    <xsl:attribute name="myattr">first calculated value</xsl:attribute>
  </xsl:template>
  <xsl:template match="/">
    <myelem>
      <xsl:call-template name="helper" />
      <xsl:variable name="temp" select="@myattr"/>
      <xsl:attribute name="myattr">
        <xsl:value-of select="concat($temp, 'second calculated value')"  />
      </xsl:attribute>
    </myelem>
  </xsl:template>

答案 3 :(得分:0)

虽然它或多或少是相同的,但我更喜欢创建变量的更简洁方式,而不是拥有帮助模板。请注意,对于更复杂的情况,您仍然可以在xsl:variable中调用模板。

<xsl:template match="/">
  <myelem>
    <xsl:variable name="first">first calculated value </xsl:variable >
    <xsl:attribute name="myattr">
       <xsl:value-of select="concat($first, 'second calculated value')"/>
    </xsl:attribute>
  </myelem>
</xsl:template>