我有一个示例 xml 输入,如下所示:
<table name="Table1">
<fields>
<field name="Field1" />
<field name="Field2" />
<field name="Field3" />
<field name="Field4" />
</fields>
<data>
<row value="2,Description1,A,AA" />
<row value="3,Description2,B,BB" />
<row value="7,Description3,C,CC" />
</data>
</table>
<table name="Table2">
<fields>
<field name="Field7" />
<field name="Field8" />
<field name="Field9" />
</fields>
<data>
<row value="Q,Description7,A" />
<row value="W,Description8,B" />
<row value="X,Description9,C" />
</data>
</table>
请注意,我可以有许多具有不同字段数的表,但行值始终包含所需的确切字段数。
预期的结果是这样的输出:
<ListOfTable1>
<item>
<Field1>2</Field1>
<Field2>Description1</Field2>
<Field3>A</Field3>
<Field4>AA</Field4>
</item>
<item>
<Field1>3</Field1>
<Field2>Description2</Field2>
<Field3>B</Field3>
<Field4>BB</Field4>
</item>
<item>
<Field1>7</Field1>
<Field2>Description3</Field2>
<Field3>C</Field3>
<Field4>CC</Field4>
</item>
</ListOfTable1>
<ListOfTable2>
<item>
<Field7>Q</Field7>
<Field8>Description7</Field8>
<Field9>A</Field9>
</item>
<item>
<Field7>W</Field7>
<Field8>Description8</Field8>
<Field9>B</Field9>
</item>
<item>
<Field7>X</Field7>
<Field8>Description9</Field8>
<Field9>C</Field9>
</item>
</ListOfTable2>
不幸的是,我只能使用严格的 XSLT 1.0 没有外部函数或参考
我一直在使用建议的第三个解决方案的略微修改版本
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="//table">
<xsl:value-of disable-output-escaping="yes" select="concat('<ListOf',@name,'>')" />
<xsl:apply-templates />
<xsl:value-of disable-output-escaping="yes" select="concat('</ListOf',@name,'>')" />
</xsl:template>
<xsl:template match="table/data/row">
<item>
<xsl:call-template name="fldsplit">
<xsl:with-param name="f" select="@value" />
<xsl:with-param name="set" select="//fields/field" />
</xsl:call-template>
</item>
</xsl:template>
<xsl:template name="fldsplit">
<xsl:param name="f" />
<xsl:param name="set"/>
<xsl:variable name="bfc" select="substring-before($f,',')"/>
<xsl:variable name="afc" select="substring-after($f,',')"/>
<xsl:element name="{$set/@name}">
<xsl:choose>
<xsl:when test="$bfc">
<xsl:value-of select="$bfc"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$f"/>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
<xsl:if test="$afc">
<xsl:call-template name="fldsplit">
<xsl:with-param name="f" select="$afc"/>
<xsl:with-param name="set" select="$set/following-sibling::*" />
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
但是我对第二个表(或我添加到输入的任何其他表)有一个问题,即字段名称总是从 Field1 开始重复,而我希望为每个解析的表使用特定字段
这是当前输出(错误)
<?xml version="1.0" encoding="UTF-8"?>
<ListOfTable1>
<item><Field1>2</Field1><Field2>Description1</Field2><Field3>A</Field3><Field4>AA</Field4></item>
<item><Field1>3</Field1><Field2>Descritpion2</Field2><Field3>B</Field3><Field4>BB</Field4></item>
<item><Field1>7</Field1><Field2>Description3</Field2><Field3>C</Field3><Field4>CC</Field4></item>
</ListOfTable1>
<ListOfTable2>
<item><Field1>Q</Field1><Field2>Description7</Field2><Field3>A</Field3></item>
<item><Field1>W</Field1><Field2>Description8</Field2><Field3>B</Field3></item>
<item><Field1>X</Field1><Field2>Description9</Field2><Field3>C</Field3></item>
</ListOfTable2>