2011-04-11 101 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