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>