2015-01-08 12 views
0

У меня есть XML, который я пытаюсь преобразовать в более легко усваиваемый XML-файл. Проблема, которая у меня есть, состоит в том, что имена элементов и атрибутов имеют номера в конце их. Я был в состоянии получить первый уровень элементов, работающих с этим:Имена XSLT и динамических атрибутов

<xsl:template match="*[starts-with(name(), 'node')]" name="reports"> 

Я также смог создать шаблон для section1, но я не уверен, как получить доступ к его области * атрибут в шаблоне. Это то, что образец исходного XML выглядит следующим образом:

<node01> 
    <report> 
    <section1 region1="World"> 
     ... 
    </section1> 
    <section2 region2="EU"> 
     ... 
    </section2> 
    <report> 
<node01> 

Я надеюсь иметь выход, который выглядит примерно так:

<reports> 
    <report> 
    <region> 
     <name>World</name> 
     ... 
    </region> 
    <region> 
     <name>EU</name> 
     ... 
    </region> 
    <report> 
<reports> 
+0

Вы говорите, что в 'region' элементов имеют больше контента, чем просто имя? С вашего вопроса не совсем понятно, где вы застряли. Вы должны показать свою попытку. – JLRishe

+0

Пожалуйста, разместите XML-вход, который является достаточно сложным, т. Е. Иллюстрирует всю сложность, присутствующую в ваших реальных данных. Также покажите полную таблицу стилей XSLT. –

ответ

1

Не знаю, где вы застряли с этим. Вот один способ, которым Вы могли бы смотреть на него:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/node01"> 
    <reports> 
     <xsl:apply-templates/> 
    </reports> 
</xsl:template> 

<xsl:template match="report"> 
    <xsl:copy> 
     <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*[starts-with(name(), 'section')]"> 
    <xsl:apply-templates select="@*"/> 
</xsl:template> 

<xsl:template match="@*[starts-with(name(), 'region')]"> 
    <region> 
     <name><xsl:value-of select="."/></name> 
    </region> 
</xsl:template> 

</xsl:stylesheet> 

Вот еще:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> 

<xsl:template match="/*"> 
    <reports> 
     <xsl:for-each select="report"> 
      <xsl:copy> 
       <xsl:for-each select="*/@*"> 
        <region> 
         <name><xsl:value-of select="."/></name> 
        </region> 
       </xsl:for-each> 
      </xsl:copy> 
     </xsl:for-each> 
    </reports> 
</xsl:template> 

</xsl:stylesheet> 
Смежные вопросы