XSL - декларативный язык в формате XML. Файл XSLT должен быть правильно сформированным XML.
То, что вы пробовали, похоже, у вас есть знание программирования императивного языка, где вы можете писать выражения типа "ABC" + $var1
. Однако это нарушает правила формата XML в XSL. Элементы следуют шаблону <elementname attribute1="value1" attributeN="valueN">...</elementname>
. В вашем коде вы ставите +$var1
после конца атрибута myAttr, который заканчивается на второй кавычке - и это недопустимо: <frequency myAttr="ABC"+$var1 >
<frequency myAttr="ABC+$var1">
приведет к буквальному значению атрибута ABC+$var1
, а это не то, что вам нужно. Это также произойдет, если вы попытаетесь использовать синтаксис XPath в качестве значения атрибута, concat('ABC', $var1)
как строку из <frequency myAttr="concat('ABC', $var1)">
.
Вы можете использовать синтаксис «Шаблон значения атрибута», как предложил michael.hor257k, что по сути означает оборачивать выражения XPath в фигурные скобки внутри строк значений атрибута.
Другим способом было бы не писать элемент как литерал в вашем коде, а объявить его:
<xsl:variable name="var1" select="'DEF'"/>
<xsl:element name="frequency">
<xsl:attribute name="myAttr">
<xsl:value-of select="concat('ABC', $var1)"/>
</xsl:attribute>
</xsl:element>
Обратите внимание, что я исправил определение переменной: в атрибуте select
вы должны поставить DEF
в одинарных кавычках, если предполагается, что это строка, например select="'DEF'"
. Без одинарных кавычек вы определяете переменную для ссылки на <DEF>
элементы в исходном XML.
В атрибуте select
<xsl:value-of>
я использовал функцию XPath concat()
для объединения строки 'ABC'
и содержимого переменной $var1
. Синтаксис шаблона значения атрибута не может использоваться здесь: select="'ABC{$var1}'"
приведет к строке ABC{$var1}
.
Разновидностью приведенного выше примера будет использование <xsl:text>
для строки ABC
и <xsl:value-of>
для вывода содержимого $var1
:
<xsl:variable name="var1" select="'DEF'"/>
<xsl:element name="frequency">
<xsl:attribute name="myAttr">
<xsl:text>ABC</xsl:text>
<xsl:value-of select="$var1"/>
</xsl:attribute>
</xsl:element>
Таким образом, есть три решения, одно краткое и два декларативных. Какой из них вы выбираете, зависит от вас. Самый быстрый для ввода, конечно, первый:
<xsl:variable name="var1" select="'DEF'"/>
<frequency myAttr="ABC{$var1}">
<xsl:value-of select="frequency"/>
</frequency>
... но вы также должны знать оба декларативных способа достижения одного и того же результата и понимать, как они работают.