我有類似下面的示例XML輸入:XSL 1.0格式表格拆分值
<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>
但我有第二個表(或任何其他我添加到輸入)的問題,那就是字段名稱repeat themselve ■從字段1總是在啓動,而我希望使用特定字段爲每個表解析的
這是電流輸出(錯誤)
<?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>
嘿,如果你多次改變了初始條件,那麼這不是一個問題,它是一個「請做我的工作」! –
對不起Orabig,實際上我沒有改變條件,因爲初始結構解析是相同的,但是在文件內部重複。像其他人一樣,您的建議可以正常工作,但目前所有人都以不同的方式管理字段和行。我試圖繞過這個騎自行車通過表,但到目前爲止沒有得到解決方案 – AndreaPappy