2016-02-29 6 views
0

Я новичок в XSLT. Я хочу преобразовать один формат XML в другой формат. Входной формат:XSLT для преобразования XML в другой формат

<record> 
    <field>Firstname</field> 
    <field>Lastname</field> 
</record> 
<record> 
    <field>abc</field> 
    <field>def</field> 
</record> 
<record> 
    <field>geh</field> 
    <field>fgh</field> 
</record> 

мне нужен выход из XSLT, как показано ниже. Обратите внимание, что первая запись на входе будет иметь имена полей. Количество полей на входах может очень сильно, поэтому XSLT также должен позаботиться об этом.

<record> 
    <Firstname>abc</field> 
    <Lastname>def</field> 
</record> 
<record> 
    <Firstname>geh</field> 
    <Lastname>fgh</field> 
</record> 

Любая помощь будет очень признательна.

Благодаря,

ответ

0

дали хорошо сформированные ввода, такие как:

<root> 
    <record> 
     <field>Firstname</field> 
     <field>Lastname</field> 
    </record> 
    <record> 
     <field>abc</field> 
     <field>def</field> 
    </record> 
    <record> 
     <field>geh</field> 
     <field>fgh</field> 
    </record> 
</root> 

следующая таблица стилей:

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="/root"> 
    <root> 
     <xsl:variable name="field-names" select="record[1]/field" /> 
     <xsl:for-each select="record[position() > 1 ]"> 
      <xsl:copy> 
       <xsl:for-each select="field"> 
       <xsl:variable name="i" select="position()" /> 
        <xsl:element name="{$field-names[$i]}"> 
         <xsl:value-of select="." /> 
        </xsl:element> 
       </xsl:for-each> 
      </xsl:copy>  
     </xsl:for-each> 
    </root> 
</xsl:template> 

</xsl:stylesheet> 

будет RETU rn:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <record> 
     <Firstname>abc</Firstname> 
     <Lastname>def</Lastname> 
    </record> 
    <record> 
     <Firstname>geh</Firstname> 
     <Lastname>fgh</Lastname> 
    </record> 
</root> 

Обратите внимание, что это предполагает, что предоставленные имена столбцов являются действительными именами XML-элементов.

+0

благодарит за ответ. Это сработало. – omkar

+0

@omkar Если на ваш вопрос ответили, пожалуйста, закройте его, приняв ответ. –

0

Вы новичок в XSLT, так что давайте будем педагогическими! Предлагаю следующее решение для сравнения с michael.hor257k's. Мой удар декларативный характер XSLT. Вы заметите, что нет цикла for-each. Также обратитесь к анкете michael.hor257k для корректного ввода xml.

<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="/root"> 
    <root> 
     <xsl:apply-templates select="record[position() > 1 ]"/> 
    </root> 
    </xsl:template> 

    <xsl:template match="record"> 
    <xsl:copy> 
     <xsl:apply-templates select="field"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="field"> 
    <xsl:variable name="pos" select="position()"/> 
    <xsl:element name="{//record[1]/field[position()=$pos]/text()}"> 
     <xsl:value-of select="."/> 
    </xsl:element> 
    </xsl:template> 

</xsl:stylesheet>