2008-08-26 3 views
13

Я хочу преобразовать 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" и "// SVC: Элемент/год" не работает. Одним из осложнений является то, что тег «Элемент» находится в пространстве имен «svc», в то время как тег «Год» находится в пространстве имен по умолчанию.

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

+0

Рад, что решение работает. Но в целом я бы рекомендовал НЕ создавать имена тегов во время выполнения на лету (хотя он работает!). Я понимаю структуру xml TAG более статическим образом. Моим решением было бы: взять такой статический XML-тег, как с таким атрибутом. Вы можете получить доступ к нему с помощью XSLT и XPath с помощью «element [year =« 2007 »]. Таким образом, вы не теряете гибкость, а получаете безопасность и согласованность ... Только то, что вам нужно: – Sauer 2016-01-21 11:02:59

ответ

12

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

+0

FYI, если вам нужно ссылаться на параметры в concat, используйте `{concat {'a', $ myParam, 'c')}` – raffian 2012-09-26 20:10:56

Смежные вопросы