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 ответов


один из подходов, который вы могли бы принять, это добавить параметр в шаблон помощника, который вы добавляете к значению атрибута.

<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>

вам не нужно устанавливать параметр с каждым вызовом. Если вы не хотите ничего добавлять, просто назовите помощник шаблон без параметра и ничего не добавит к первому вычисленному значению.


самым простым подходом было бы немного изменить вложенность-иметь 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> элементов

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

попробуйте это:

  <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>

хотя это более или менее одно и то же, я бы предпочел более краткий способ создания переменной, а не вспомогательный шаблон. Обратите внимание, что вы все еще можете вызвать шаблон из переменной xsl:для более сложного случая.

<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>