2014-02-17 2 views
0

Мой ввод XML являетсяПреобразование вложенных XML атрибуты элементов XSLT

<?xml version="1.0" encoding="UTF-8"?> 
<foobar atr0="NO" atr2="NO"> 
    <foo atr1="NO" more="more">ONE</foo> 
    <bar atr6="ATR"> 
     <baz attr="123" attr222="22">TWO</baz> 
    </bar> 
</foobar> 

Мой требуемый выход

<?xml version="1.0" encoding="UTF-8"?> 
<foobar> 
    <foo> 
     <a> 
      <a> 
       <a>atr1</a> 
       <v>NO</v> 
      </a> 
      <a> 
       <a>more</a> 
       <v>more</v> 
      </a> 
     </a> 
     <v>ONE</v> 
    </foo> 
    <bar> 
     <baz> 
      <a> 
       <a> 
        <a>attr</a> 
        <v>123</v> 
       </a> 
       <a> 
        <a>attr222</a> 
        <v>22</v> 
       </a> 
      </a> 
      <v>TWO</v> 
     </baz> 
     <a> 
      <a> 
       <a>atr6</a> 
       <v>ATR</v> 
      </a> 
     </a> 
    </bar> 
    <a> 
     <a> 
      <a>atr0</a> 
      <v>NO</v> 
     </a> 
     <a> 
      <a>atr2</a> 
      <v>NO</v> 
     </a> 
    </a> 
</foobar> 

Я пытаюсь разбить каждый атрибут, чтобы отделить отличительные элементы с именем и значением .the FOOBAR атрибуты элементов - это последний дочерний элемент дочерних элементов foobar. Родительский элемент будет иметь свои атрибуты в качестве последних дочерних элементов.

мой XSLT сценарий -

<?xml version="1.0" encoding="utf-8"?> 
<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="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*| node()"/> 
      <v> 
       <xsl:value-of select="."/> 
      </v> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="@*"> 
     <a> 
      <a> 
       <xsl:value-of select="name()"/> 
      </a> 
      <v> 
       <xsl:value-of select="."/> 
      </v> 
     </a> 
    </xsl:template> 
</xsl:stylesheet> 

это хорошо для 1 атрибута. Что я могу сделать для вложенных элементов и атрибутов?

ответ

0

Следующая XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<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="*"/> 

    <!-- Matches all kind of nodes --> 
    <xsl:template match="*"> 
     <xsl:copy> 
      <xsl:apply-templates select="*" /> 
      <a> 
       <xsl:apply-templates select="@*" /> 
      </a> 
      <xsl:apply-templates select="text()" /> 
     </xsl:copy> 
    </xsl:template> 

    <!-- Matches all attributes --> 
    <xsl:template match="@*"> 
     <a> 
      <a><xsl:value-of select="name()" /></a> 
      <v><xsl:value-of select="." /></v> 
     </a> 
    </xsl:template> 

    <!-- Matches text nodes --> 
    <xsl:template match="text()"> 
     <v><xsl:value-of select="." /></v> 
    </xsl:template> 
</xsl:stylesheet> 

Производит разыскиваемого выход.

+0

спасибо Mark .... thats большой ........ –

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