Имена динамических элементов
-
09-06-2019 - |
Вопрос
Я хочу преобразовать 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)}"/>
Результатом является серия элементов, которые выглядят следующим образом: <НовыйТег>.(Без пробелов...)
"//Элемент/Год", "./Элемент/Год", и "//svc:Элемент/Год" тоже не работай.Одна из сложностей заключается в том, что тег «Элемент» находится в пространстве имен «svc», а тег «Год» — в пространстве имен по умолчанию.
В любом случае, я столкнулся с проблемой пространства имен или я неправильно использую функцию «concat()»?
Решение
Вероятно, проблемы с пространством имен и, возможно, с текущим контекстом.Для источника (с добавленным объявлением пространства имен, чтобы сделать его правильно сформированным 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
.