2012-05-11 190 views
0

我的XML文件看起來像XSLT分組基於元素屬性

<templates> 
    <template type="ORC"> 
     <field/> 
    </template> 
    <template type="OBR"> 
     <field/> 
    </template> 
    <template type="OBX"> 
     <field/> 
    </template> 
    <template type="OBX"> 
     <field/> 
    </template> 
    <template type="SPM"> 
     <field/> 
    </template> 
    <template type="ORC"> 
     <field/> 
    </template> 
    <template type="OBR"> 
     <field/> 
    </template> 
    <template type="OBX"> 
     <field/> 
    </template> 
    <template type="OBX"> 
     <field/> 
    </template> 
    <template type="SPM"> 
     <field/> 
    </template> 
</templates> 

我想組訂單細節(模板/ @類型=「ORC」)和轉換以上示例XML到下面格式XSLT 2.0

<templates> 
    <order-details> 
     <template type="ORC"> 
      <field/> 
     </template> 
     <template type="OBR"> 
      <field/> 
     </template> 
     <template type="OBX"> 
      <field/> 
     </template> 
     <template type="OBX"> 
      <field/> 
     </template> 
     <template type="SPM"> 
      <field/> 
     </template> 
    </order-details> 
    <order-details> 
     <template type="ORC"> 
      <field/> 
     </template> 
     <template type="OBR"> 
      <field/> 
     </template> 
     <template type="OBX"> 
      <field/> 
     </template> 
     <template type="OBX"> 
      <field/> 
     </template> 
     <template type="SPM"> 
      <field/> 
     </template> 
    </order-details> 
</templates> 
+0

分組將需要一個共同的價值,你想拆就'@類型= 「ORC」' – Tommy

+0

@Tommy - 在這種情況下,分組只需要以'@ type =「ORC」'開頭。請參閱Pavel的答案,瞭解如何在XSLT 2.0中執行此操作。在1.0中也很容易;如果您願意,我可以用1.0解決方案添加答案。 –

回答

2

您可以使用xsl:for-each-groupgroup-starting-with屬性做分組你想要的方式。

這裏:

<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="templates"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <xsl:for-each-group select="template" 
           group-starting-with="*[@type='ORC']"> 
       <order-details> 
        <xsl:apply-templates select="current-group()"/> 
       </order-details> 
      </xsl:for-each-group> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

當應用到你的輸入文檔產生爲您所指定的預期輸出:

<templates> 
    <order-details> 
     <template type="ORC"> 
     <field/> 
     </template> 
     <template type="OBR"> 
     <field/> 
     </template> 
     <template type="OBX"> 
     <field/> 
     </template> 
     <template type="OBX"> 
     <field/> 
     </template> 
     <template type="SPM"> 
     <field/> 
     </template> 
    </order-details> 
    <order-details> 
     <template type="ORC"> 
     <field/> 
     </template> 
     <template type="OBR"> 
     <field/> 
     </template> 
     <template type="OBX"> 
     <field/> 
     </template> 
     <template type="OBX"> 
     <field/> 
     </template> 
     <template type="SPM"> 
     <field/> 
     </template> 
    </order-details> 
</templates>