2016-02-29 120 views
0

我是XSLT的新手。我想将一种XML格式转换为另一种格式。 输入格式:将XML转换为另一种格式的XSLT

<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> 

将换货政... 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进行比较。我的重点是XSLT的声明性性质。你会注意到每个循环都没有for。另请参阅michael.hor257k的anwser for well-formed input 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> 
相关问题