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

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

14
задан 17.05.2020, 06:34

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.

13
ответ дан 17.05.2020, 06:35
  • 1
    К вашему сведению, если необходимо сослаться на параметрические усилители в concat, используйте {concat{'a',$myParam,'c')} – raffian 17.05.2020, 06:35

Теги

Похожие вопросы