我有一个如下所示的XML:
<?xml version="1.0"?>
<ROWSET>
<ROW>
<KUNDENNR>63564</KUNDENNR>
<JAHR>2012</JAHR>
<MONAT>2</MONAT>
<NAME>John Doe</NAME>
<NETTO>504,66</NETTO>
<DB_BASIS>21,56</DB_BASIS>
<EKECHT>482,56</EKECHT>
<NAME1>Some Name</NAME1>
<NAME2>BA 31 (BÜRO GGR 1)</NAME2>
<LAND>AT</LAND>
<PLZ>1082</PLZ>
<ORT>Wien</ORT>
<ADM>Henry Ford</ADM>
<KUNDENKLASSE>A</KUNDENKLASSE>
<UEBERKUNDE>Some Value</UEBERKUNDE>
<HANDLING>22,577179011</HANDLING>
<SOLLFRACHT>22,68</SOLLFRACHT>
<DG_BASIS_P>-10,763888888888888888888888888888888889</DG_BASIS_P>
</ROW>
<ROW>
<KUNDENNR>63564</KUNDENNR>
<JAHR>2011</JAHR>
<MONAT>1</MONAT>
<NAME>John Doe</NAME>
<NETTO>502,66</NETTO>
<DB_BASIS>21,56</DB_BASIS>
<EKECHT>482,56</EKECHT>
<NAME1>Some Name</NAME1>
<NAME2>BA 31 (BÜRO GGR 1)</NAME2>
<LAND>AT</LAND>
<PLZ>1082</PLZ>
<ORT>Wien</ORT>
<ADM>Henry Ford</ADM>
<KUNDENKLASSE>A</KUNDENKLASSE>
<UEBERKUNDE>Some value</UEBERKUNDE>
<HANDLING>22,577179011</HANDLING>
<SOLLFRACHT>22,68</SOLLFRACHT>
<DG_BASIS_P>-10,538888888888888888889</DG_BASIS_P>
</ROW>
</ROWSET>
请注意,第一个和最后一个元素具有相同的值。现在我想用XSLT将XML转换为以下结构:
<?xml version="1.0"?>
<ROWSET>
<KUNDE>
<KUNDENNR>63564</KUNDENNR>
<NAME>John Doe</NAME>
<NAME1>Some Name</NAME1>
<NAME2>BA 31 (B RO GGR 1)</NAME2>
<LAND>AT</LAND>
<PLZ>1082</PLZ>
<ORT>Wien</ORT>
<ADM>Henry Ford</ADM>
<KUNDENKLASSE>A</KUNDENKLASSE>
<UEBERKUNDE>Some Value</UEBERKUNDE>
<ROW>
<JAHR>2012</JAHR>
<MONAT>2</MONAT>
<NETTO>504,66</NETTO>
<DB_BASIS>21,56</DB_BASIS>
<EKECHT>482,56</EKECHT>
<HANDLING>22,577179011</HANDLING>
<SOLLFRACHT>22,68</SOLLFRACHT>
<DG_BASIS_P>4,27218325209051638727063765703642056038</DG_BASIS_P>
</ROW>
<ROW>
<JAHR>2012</JAHR>
<MONAT>1</MONAT>
<NETTO>502,66</NETTO>
<DB_BASIS>21,56</DB_BASIS>
<EKECHT>482,56</EKECHT>
<HANDLING>22,577179011</HANDLING>
<SOLLFRACHT>22,68</SOLLFRACHT>
<DG_BASIS_P>-10,538888888888888888889</DG_BASIS_P>
</ROW>
</KUNDE>
</ROWSET>
XML是从数据库导出的,我需要将其转换为更好的结构。我已经尝试过使用XSLT的几个不同的东西,但我是XSLT的新手,并希望寻求帮助。
提前谢谢。
答案 0 :(得分:0)
您可以使用XSLT分组,这是一个XSLT 2.0功能。
诀窍是使用&lt; xsl:for-each-group&gt;元件。
请注意,以下代码不完整 - 您需要&lt; copy-of ...&gt;您需要的所有节点。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="ROWSET">
<ROWSET>
<xsl:for-each-group select="ROW" group-by="KUNDENNR">
<KUNDE>
<!-- this is the common part -->
<xsl:copy-of select="NAME1" />
<xsl:copy-of select="UEBERKUNDE" />
<!-- iterate over every ROW in the group -->
<xsl:for-each select="current-group()">
<ROW>
<xsl:copy-of select="JAHR" />
<xsl:copy-of select="MONAT" />
</ROW>
</xsl:for-each>
</KUNDE>
</xsl:for-each-group>
</ROWSET>
</xsl:template>
</xsl:stylesheet>
鉴于您的XML文档和上面的XSLT,输出将是:
<?xml version="1.0" encoding="UTF-8"?>
<ROWSET>
<KUNDE>
<NAME1>Some Name</NAME1>
<UEBERKUNDE>Some Value</UEBERKUNDE>
<ROW>
<JAHR>2012</JAHR>
<MONAT>2</MONAT>
</ROW>
<ROW>
<JAHR>2011</JAHR>
<MONAT>1</MONAT>
</ROW>
</KUNDE>
</ROWSET>
您还可以阅读this article,其中有一些使用for-each-group的好例子。