2011-04-11 109 views
0

我有一個如下所示的xml。XSLT每4個相鄰元素分組

源XML:

<?xml version="1.0" encoding="Windows-1252"?> 
<XML> 
    <Attributes> 
    <Attribute> 
     <Name>Collection</Name> 
     <Value /> 
    </Attribute> 
    <Attribute> 
     <Name>A</Name> 
     <Value>Testing</Value> 
    </Attribute> 
    <Attribute> 
     <Name>B</Name> 
     <Value>Blank</Value> 
    </Attribute> 
    <Attribute> 
     <Name>C</Name> 
     <Value>11</Value> 
    </Attribute> 
    <Attribute> 
     <Name>D</Name> 
     <Value>NA</Value> 
    </Attribute> 
    <Attribute> 
     <Name>A</Name> 
     <Value>Testing1</Value> 
    </Attribute> 
    <Attribute> 
     <Name>B</Name> 
     <Value>Red</Value> 
    </Attribute> 
    <Attribute> 
     <Name>C</Name> 
     <Value>12</Value> 
    </Attribute> 
    <Attribute> 
     <Name>D</Name> 
     <Value>NAT</Value> 
    </Attribute> 
    </Attributes> 
</XML> 

從上面的XML我如何我做到這一點。我只想將它們分組爲4個。因此,前4個(在源xml中)元素的/ attribute/Name ='A' -/attribute/Name ='D'將位於第一個組中。和接下來的4其中/屬性/名稱= 'A' - /屬性/名稱= 'd' 將是在第二組中....像下面

由於提前

輸出

<Collection name="Collection" > 
      <ComplexAttr> 
        <Attr name="A" value="Testing" /> 
        <Attr name="B" value="Blank" /> 
        <Attr name="C" value="11" /> 
        <Attr name="D" value="NA" /> 
      </ComplexAttr> 
      <ComplexAttr > 
        <Attr name="A" value="Testing1" /> 
        <Attr name="B" value="Red" /> 
        <Attr name="C" value="12" /> 
        <Attr name="D" value="NA" /> 
      </ComplexAttr> 
    </Collection> 
+1

的可能的複製http://stackoverflow.com/questions/5487436/use-xslt-to-format- xml-elements-into-html-in-sets-of-two(其中'n'是2而不是'4',但仍是相同的問題)。 – 2011-04-11 17:12:27

+0

@lwburk:除非可以依次丟失'Attribute' ... – 2011-04-11 17:25:29

+0

@Ajjandro - 如果要求總是以'D'結尾並從'A'開始,解決方案就更加複雜。然後它不是一個直截了當的4組總是現在的項目。 – 2011-04-11 17:27:40

回答

0

這是一個常見問題解答。在你的問題的評論中看到我的鏈接。下面是一個樣式爲您量身定製的輸入和期望的輸出:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <!-- the number of items to include in each group --> 
    <xsl:variable name="group" select="4" /> 
    <xsl:template match="/"> 
     <Collection name="Collection"> 
      <xsl:apply-templates 
       select="XML/Attributes/Attribute[not(Name='Collection')] 
               [position() mod $group = 1]" /> 
     </Collection> 
    </xsl:template> 
    <xsl:template match="Attribute" mode="inner"> 
     <Attr name="{Name}" value="{Value}" /> 
    </xsl:template> 
    <xsl:template match="Attribute"> 
     <ComplexAttr> 
      <xsl:apply-templates 
       select=".|following-sibling::Attribute[position() &lt; $group]" 
       mode="inner" /> 
     </ComplexAttr> 
    </xsl:template> 
</xsl:stylesheet> 

產地:

<Collection name="Collection"> 
    <ComplexAttr> 
     <Attr name="A" value="Testing" /> 
     <Attr name="B" value="Blank" /> 
     <Attr name="C" value="11" /> 
     <Attr name="D" value="NA" /> 
    </ComplexAttr> 
    <ComplexAttr> 
     <Attr name="A" value="Testing1" /> 
     <Attr name="B" value="Red" /> 
     <Attr name="C" value="12" /> 
     <Attr name="D" value="NAT" /> 
    </ComplexAttr> 
</Collection> 
+0

@Iwburk。感謝你的幫助。它效果很好。 – JohnXsl 2011-04-11 17:35:13