Я хочу преобразовать 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)}"/>
The output is a series of elements that look like this: . (Без пробелов ...)
«// Элемент / год», "./Element/Year" и "// svc: элемент / год" тоже не работают. Одна из сложностей заключается в том, что тег «Element» находится в пространстве имен «svc», а тег «Year» находится в пространстве имен по умолчанию.
Так или иначе, столкнулся ли я с проблемой пространства имен или я неправильно использую функцию «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.
К вашему сведению, если вам нужно ссылаться на параметры в concat, используйте {concat{'a',$myParam,'c')}
Рад, что решение работает. Но в целом я бы рекомендовал НЕ создавать имена тегов во время выполнения на лету (хотя это работает!). Я понимаю структуру тегов xml более статично. Мое решение: возьмите статический тег XML, напримерс таким атрибутом. Вы по-прежнему можете получить к нему доступ с помощью XSLT и XPath с помощью "element [year =" 2007 "]. Таким образом, вы не потеряете гибкость, но получите безопасность и согласованность ... Просто немного.