Сведения о вопросе

Codeliver

03:51, 11th August, 2020

Теги

xml   xslt   namespaces    

Динамические Имена Элементов

Просмотров: 404   Ответов: 1

Я хочу преобразовать документ 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 > . (Без пробелов...)

"//Element/Year" , "./Element/Year" и "//svc:Element/Year " тоже не работают. Одна из сложностей заключается в том, что тег "Element" находится в пространстве имен "svc", а тег "Year"-в пространстве имен по умолчанию.

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



  Сведения об ответе

appple

17:47, 21st August, 2020

Вероятно, проблемы с пространством имен и, возможно, с текущим контекстом. Для источника (с добавленным объявлением пространства имен, чтобы сделать его хорошо сформированным 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 .


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться