我是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 :(得分: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>
将返回:
<?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元素名称。
答案 1 :(得分:0)
你是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>