XSLT создать имя узла из переменной

Когда у меня есть эти две переменные

<xsl:variable name="a" select="'Total'" />
<xsl:variable name="b" select="'500'" />

Я хотел бы создать узел с именем переменной «a» и его содержимым из переменной «b». Мне приходится использовать xsltproc с XSLT 1.0 и парой расширений EXSLT (среди них — набор узлов), так что часть этого я выполнил:

<xsl:template match="/">
  <xsl:variable name="x" >
    &lt;<xsl:value-of  select="$a" />&gt;
        <xsl:value-of  select="$b" />
    &lt;/<xsl:value-of  select="$a" />&gt;
  </xsl:variable>
  <xsl:value-of disable-output-escaping="yes" select="$x" />
</xsl:template>

действительно выводит это (на данный момент меня не волнуют пробелы):

<?xml version="1.0"?>

    <Total>
        500
    </Total>

Но: я хочу использовать переменную 'x' в качестве набора узлов, чтобы в дальнейшем манипулировать им (конечно, мой реальный пример более сложен). Что я сделал, так это преобразовал его в набор узлов (используя exslt.org/common), который, кажется, работает, но доступ к содержимому не работает.

  <xsl:variable name="nodes" select="common:node-set($x)" />
  <xsl:value-of select="$nodes/Total" />

ни к чему не приводит. Я ожидал "500", так как $nodes/Total должно быть допустимым выражением XPATH 1.0. Очевидно, я что-то упускаю. Я думаю, дело в том, что динамическое создание имени узла с помощью &lt;...&gt; на самом деле не создает узел, а просто какой-то текстовый вывод, так как я могу добиться здесь истинного создания узла?


person Andreas    schedule 04.02.2013    source источник


Ответы (1)


Это преобразование:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:variable name="a" select="'Total'" />
 <xsl:variable name="b" select="'500'" />


 <xsl:template match="/*">
  <xsl:variable name="rtfX">
    <xsl:element name="{$a}">
      <xsl:value-of select="$b"/>
    </xsl:element>
  </xsl:variable>

  <xsl:value-of select="ext:node-set($rtfX)/Total"/>
 </xsl:template>
</xsl:stylesheet>

при применении к любому XML-документу (не используемому) дает желаемый правильный результат:

500
person Dimitre Novatchev    schedule 06.02.2013
comment
Отлично (как обычно, я должен сказать), я мог применить это к своей реальной проблеме, я играл с xsl: element, но не понял фигурные скобки, спасибо. - person Andreas; 06.02.2013
comment
Готово, я все еще новичок в stackoverflow :-) Я не могу голосовать, так как у меня еще недостаточно «репутации». - person Andreas; 07.02.2013
comment
@Andreas, NP, для этого и нужен SO - все мы каждый день учимся чему-то новому :) - person Dimitre Novatchev; 07.02.2013