Использование переменной в атрибуте узла - PullRequest
0 голосов
/ 06 января 2019

Я пишу шаблон XSL. Я не понимаю, как указать переменную для пользовательского атрибута в файле XSL.

Я пытаюсь этот код в XSL:

<xsl:variable name="var1" select="DEF"/>    
<frequency myAttr="ABC"+$var1 >    
     <xsl:value-of select="frequency"/>    
</frequency>  

Ожидаемый результат

<frequency myAttr="ABCDEF" >20</frequency>

Я получаю эту ошибку:

Невозможно сгенерировать документ XML с использованием предоставленного ввода XML / XSL. org.xml.sax.SAXParseException; номер строки: 18; номер столбца: 24; За типом элемента "sourceId" должны следовать либо спецификации атрибутов, ">" или "/>"

Проблема в том, что я объединяюсь неправильно. Любая помощь в достижении этого?

Ответы [ 2 ]

0 голосов
/ 06 января 2019

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>

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

0 голосов
/ 06 января 2019

Я думаю, что вы имеете в виду:

<frequency myAttr="ABC{$var1}" >  

Это объединит литеральную строку "ABC" с содержимым переменной $var1 - см .: Шаблоны значений атрибутов .

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

...