這是分組(Muenchian法)溶液中的XSLT 1.0,即大多采用模板和推式中沒有<xsl:for-each>
:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kcorpActByID" match="corporationAction"
use="CorporationID"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*">
<xsl:sort select="CorporationID" data-type="number"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match=
"corporationAction|CorporationID
|ActionNotes|DocumentNumber|NumberofPages"/>
<xsl:template match=
"corporationAction
[generate-id()
=
generate-id(key('kcorpActByID', CorporationID)[1])
]">
<corporationAction>
<xsl:copy-of select="CorporationID"/>
<xsl:apply-templates mode="copy"
select="key('kcorpActByID',CorporationID)" />
</corporationAction>
</xsl:template>
<xsl:template match="corporationAction" mode="copy">
<corporationActionDetails>
<xsl:apply-templates/>
</corporationActionDetails>
</xsl:template>
</xsl:stylesheet>
當這變換應用到提供的XML文檔:
<corporationActions>
<corporationAction>
<ActionID>5530974</ActionID>
<CorporationID>1044294</CorporationID>
<ActionDate>2009-05-03</ActionDate>
<ActionType>Articles of Organization2</ActionType>
<ActionNotes></ActionNotes>
<DocumentNumber>20110258775-68</DocumentNumber>
<NumberofPages>4</NumberofPages>
</corporationAction>
<corporationAction>
<ActionID>5530975</ActionID>
<CorporationID>1044294</CorporationID>
<ActionDate>2009-05-03</ActionDate>
<ActionType>Miscellaneous</ActionType>
<ActionNotes></ActionNotes>
<DocumentNumber>20110258777-80</DocumentNumber>
<NumberofPages>2</NumberofPages>
</corporationAction>
</corporationActions>
想要的,正確的結果產生:
<corporationActions>
<corporationAction>
<CorporationID>1044294</CorporationID>
<corporationActionDetails>
<ActionID>5530974</ActionID>
<ActionDate>2009-05-03</ActionDate>
<ActionType>Articles of Organization2</ActionType>
</corporationActionDetails>
<corporationActionDetails>
<ActionID>5530975</ActionID>
<ActionDate>2009-05-03</ActionDate>
<ActionType>Miscellaneous</ActionType>
</corporationActionDetails>
</corporationAction>
</corporationActions>
請注意:增加的靈活性,由於其所使用的和壓倒一切身份模板。與之相比,我們使用<xsl:copy-of select="ActionID|ActionDate|ActionType"/>
:<xsl:apply-templates/>
,這可以確保當前節點的任何子節點都可以按照我們想要的任何方式進行處理(並進一步在單獨的模板中進行指定)。
二, XSLT 2.0解決方案:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<xsl:for-each-group select="corporationAction"
group-by="CorporationID">
<xsl:sort select="number(CorporationID)"/>
<corporationAction>
<xsl:sequence select="CorporationID"/>
<xsl:apply-templates mode="copy"
select="current-group()" />
</corporationAction>
</xsl:for-each-group>
</xsl:template>
<xsl:template match="corporationAction" mode="copy">
<corporationActionDetails>
<xsl:apply-templates/>
</corporationActionDetails>
</xsl:template>
<xsl:template match=
"corporationAction|CorporationID
|ActionNotes|DocumentNumber|NumberofPages"/>
</xsl:stylesheet>
請注意:使用<xsl:for-each-group>
和current-group()
功能簡化分組。
上面的xslt不起作用,如果我在相應的xml中有命名空間,例如 – anvv 2011-07-01 07:10:12
顯然不是,這在您的問題中沒有提及,也不能從您的輸入示例中推導出來。如果您無法自行解決問題,請根據新要求擴展問題。我們將看到如何解決它。 – 2011-07-01 07:14:45