Имена динамических элементов

Я хочу преобразовать XML-документ. Исходный XML выглядит так:

<svc:ElementList>
    <svc:Element>
        <Year>2007</Year>
    </svc:Element>
    <svc:Element>
        <Year>2006</Year>
    </svc:Element>
    <svc:Element>
        <Year>2005</Year>
    </svc:Element>
</svc:ElementList>

Я хочу превратить это в:

<ElementList>
    <NewTag2007/>
    <NewTag2006/>
    <NewTag2005/>
</ElementList>

Следующая строка кода не работает:

<xsl:element name="{concat('NewTag',Element/Year)}"/>

Результатом является ряд элементов, которые выглядят следующим образом: ‹ NewTag >. (без пробелов...)

"//Элемент/Год", "./Элемент/Год" и "//svc:Элемент/Год" не работать либо. Одна сложность заключается в том, что тег «Элемент» находится в пространстве имен «svc», а тег «Год» — в пространстве имен по умолчанию.

В любом случае, я столкнулся с проблемой пространства имен или неправильно использую функцию «concat()»?


person JPLemme    schedule 26.08.2008    source источник
comment
Рад, что решение работает. Но в целом я бы рекомендовал НЕ создавать имена тегов во время выполнения на лету (хотя это работает!). Я понимаю структуру xml TAG более статично. Мое решение было бы таким: возьмите статический тег XML, например ‹element year=2007›, с таким атрибутом. Вы по-прежнему можете получить к нему доступ с помощью XSLT и XPath с помощью element[year=2007]. Таким образом, вы не теряете гибкость, но приобретаете безопасность и согласованность... Просто мысль.   -  person Sauer    schedule 21.01.2016


Ответы (1)


Вероятно, проблемы с пространством имен и, возможно, с текущим контекстом. Для источника (с добавленным объявлением пространства имен, чтобы сделать его правильно сформированным xml)

<svc:ElementList xmlns:svc="svc">
  <svc:Element>
    <Year>2007</Year>
  </svc:Element>
  <svc:Element>
    <Year>2006</Year>
  </svc:Element>
  <svc:Element>
    <Year>2005</Year>
  </svc:Element>
</svc:ElementList>

таблица стилей

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:svc="svc"
                version="1.0">
  <xsl:template match="svc:ElementList">
    <xsl:element name="{local-name()}">
      <xsl:for-each select="svc:Element">
        <xsl:element name="{concat('NewTag', Year)}"/>
      </xsl:for-each>
    </xsl:element>
  </xsl:template> 
</xsl:stylesheet>

даст вам результат, который вам нужен. Обратите внимание, что svc:Element необходимо выбирать с использованием префикса пространства имен и что при создании новых тегов используется контекст svc:Element, а не svc:ElementList.

person jelovirt    schedule 26.08.2008
comment
К вашему сведению, если вам нужно ссылаться на параметры в concat, используйте {concat{'a',$myParam,'c')} - person raffian; 27.09.2012