XSLT将XML转换为另一种格式
我是XSLT新手。我想将一种XML格式转换为另一种格式。 输入格式:XSLT将XML转换为另一种格式,xslt,Xslt,我是XSLT新手。我想将一种XML格式转换为另一种格式。 输入格式: <record> <field>Firstname</field> <field>Lastname</field> </record> <record> <field>abc</field> <field>def</field> </record> &l
<record>
<field>Firstname</field>
<field>Lastname</field>
</record>
<record>
<field>abc</field>
<field>def</field>
</record>
<record>
<field>geh</field>
<field>fgh</field>
</record>
名字
姓氏
abc
def
格赫
fgh
我需要XSLT的输出,如下所示。请注意,输入中的第一条记录将具有字段名。输入中的字段数量可能非常多,因此XSLT也应该考虑这一点
<record>
<Firstname>abc</field>
<Lastname>def</field>
</record>
<record>
<Firstname>geh</field>
<Lastname>fgh</field>
</record>
abc
def
格赫
fgh
任何帮助都将不胜感激
谢谢,提供了格式良好的输入,例如:
<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>
名字
姓氏
abc
def
格赫
fgh
以下样式表:
XSLT1.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>
将返回:
<?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>
abc
def
格赫
fgh
请注意,这假设提供的列名是有效的XML元素名。您是XSLT新手,所以让我们学习一下! 我提出以下解决方案,供您与michael.hor257k进行比较。我强调XSLT的声明性。您会注意到每个循环都没有对应的值。另外,请参考michael.hor257k的anwser以了解格式良好的输入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>
@omkar如果您的问题得到了回答,请通过接受答案来结束。