2012-10-26 30 views
3

从XML子元素值列表我有XML如下鲜明的使用XSL

<?xml version="1.0" encoding="UTF-8"?> 
<Set> 
<Bundles> 
    <BundleID>1</BundleID> 
    <BundleDetails> 
     <Classification>A</Classification> 
     <TrackingID>34675</TrackingID> 
    </BundleDetails> 
    <BundleQty>12</BundleQty> 
</Bundles> 
<Bundles> 
    <BundleID>2</BundleID> 
    <BundleDetails> 
     <Classification>B</Classification> 
     <TrackingID>4563</TrackingID> 
    </BundleDetails> 
    <BundleDetails> 
     <Classification>A</Classification> 
     <TrackingID>4563</TrackingID> 
    </BundleDetails> 
    <BundleQty>34</BundleQty> 
</Bundles> 
<Bundles> 
    <BundleID>3</BundleID> 
    <BundleDetails> 
     <Classification>A</Classification> 
     <TrackingID>2343243</TrackingID> 
    </BundleDetails> 
    <BundleQty>22</BundleQty> 
</Bundles> 
<Bundles> 
    <BundleID>4</BundleID> 
    <BundleDetails> 
     <Classification>A</Classification> 
     <TrackingID>123231</TrackingID> 
    </BundleDetails> 
    <BundleDetails> 
     <Classification>B</Classification> 
    </BundleDetails> 
    <BundleDetails> 
     <Classification>B</Classification> 
     <TrackingID>42342</TrackingID> 
    </BundleDetails> 
    <BundleQty>33</BundleQty> 
</Bundles> 
<Bundles> 
    <BundleID>5</BundleID> 
    <BundleDetails> 
     <Classification>A</Classification> 
     <TrackingID>123231</TrackingID> 
    </BundleDetails> 
    <BundleDetails> 
     <Classification>A</Classification> 
     <TrackingID>42342</TrackingID> 
    </BundleDetails> 
    <BundleDetails> 
     <Classification>B</Classification> 
     <TrackingID>124512</TrackingID> 
    </BundleDetails> 
    <BundleQty>21</BundleQty> 
</Bundles> 
</Set> 

我需要为每套/捆绑的细节如下

Bundle# Qty Classes 
1  12  A 
2  34  A,B 
3  22  A 
4  33  A,B 
5  21  A,B 

我开始如下,但打击得到不同的班级名单。需要一些指导,

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="/"> 
    <html> 
    <body> 
    <p>Set Details</p> 
    <table> 
     <xsl:for-each select="Set/Bundles"> 
     <tr> 
      <td><xsl:value-of select="BundleID"/></td> 
      <td><xsl:value-of select="BundleQty"/></td> 
      <td>--Distinct List of ./BundleDetails/Classification </td> 
     </tr> 
     </xsl:for-each> 
    </table> 
    </body> 
    </html> 
</xsl:template> 

</xsl:stylesheet> 

提前感谢您的帮助!

谢谢!

回答

2

这种转变

<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="kClassByValAndGrParent" match="Classification" 
    use="concat(generate-id(../..),'+', .)"/> 

<xsl:template match="*"><xsl:apply-templates/></xsl:template> 

<xsl:template match="/*"> 
    <table border="1"> 
    <tr> 
     <th>Bundle#</th><th>Qty</th><th>Classes</th> 
    </tr> 
    <xsl:apply-templates/> 
    </table> 
</xsl:template> 

<xsl:template match="Bundles"> 
    <tr> 
    <xsl:apply-templates select="*[not(self::BundleDetails)]"/> 
    <td> 
    <xsl:apply-templates select= 
     "BundleDetails/Classification 
         [generate-id() 
         = 
         generate-id(key('kClassByValAndGrParent', 
             concat(generate-id(../..),'+', .) 
            )[1] 
           ) 
         ] 
     "/> 
    </td> 
    </tr> 
</xsl:template> 

<xsl:template match="BundleID|BundleQty"> 
    <td><xsl:value-of select="."/></td> 
</xsl:template> 

<xsl:template match="BundleDetails"/> 

<xsl:template match="Classification"> 
    <xsl:if test="position() > 1">,</xsl:if> 
    <xsl:value-of select="."/> 
</xsl:template> 
<xsl:template match="text()"/> 
</xsl:stylesheet> 

时所提供的XML文档应用:

<Set> 
    <Bundles> 
     <BundleID>1</BundleID> 
     <BundleDetails> 
      <Classification>A</Classification> 
      <TrackingID>34675</TrackingID> 
     </BundleDetails> 
     <BundleQty>12</BundleQty> 
    </Bundles> 
    <Bundles> 
     <BundleID>2</BundleID> 
     <BundleDetails> 
      <Classification>B</Classification> 
      <TrackingID>4563</TrackingID> 
     </BundleDetails> 
     <BundleDetails> 
      <Classification>A</Classification> 
      <TrackingID>4563</TrackingID> 
     </BundleDetails> 
     <BundleQty>34</BundleQty> 
    </Bundles> 
    <Bundles> 
     <BundleID>3</BundleID> 
     <BundleDetails> 
      <Classification>A</Classification> 
      <TrackingID>2343243</TrackingID> 
     </BundleDetails> 
     <BundleQty>22</BundleQty> 
    </Bundles> 
    <Bundles> 
     <BundleID>4</BundleID> 
     <BundleDetails> 
      <Classification>A</Classification> 
      <TrackingID>123231</TrackingID> 
     </BundleDetails> 
     <BundleDetails> 
      <Classification>B</Classification> 
     </BundleDetails> 
     <BundleDetails> 
      <Classification>B</Classification> 
      <TrackingID>42342</TrackingID> 
     </BundleDetails> 
     <BundleQty>33</BundleQty> 
    </Bundles> 
    <Bundles> 
     <BundleID>5</BundleID> 
     <BundleDetails> 
      <Classification>A</Classification> 
      <TrackingID>123231</TrackingID> 
     </BundleDetails> 
     <BundleDetails> 
      <Classification>A</Classification> 
      <TrackingID>42342</TrackingID> 
     </BundleDetails> 
     <BundleDetails> 
      <Classification>B</Classification> 
      <TrackingID>124512</TrackingID> 
     </BundleDetails> 
     <BundleQty>21</BundleQty> 
    </Bundles> 
</Set> 

产生想要的,正确的结果

<table border="1"> 
    <tr> 
     <th>Bundle#</th> 
     <th>Qty</th> 
     <th>Classes</th> 
    </tr> 
    <tr> 
     <td>1</td> 
     <td>12</td> 
     <td>A</td> 
    </tr> 
    <tr> 
     <td>2</td> 
     <td>34</td> 
     <td>B,A</td> 
    </tr> 
    <tr> 
     <td>3</td> 
     <td>22</td> 
     <td>A</td> 
    </tr> 
    <tr> 
     <td>4</td> 
     <td>33</td> 
     <td>A,B</td> 
    </tr> 
    <tr> 
     <td>5</td> 
     <td>21</td> 
     <td>A,B</td> 
    </tr> 
</table> 

说明

  1. 正确使用的Muenchian Grouping Method

  2. 正确复合key定义指定任何Classification作为其宏伟母体的函数,并且它的字符串值。

+0

+1我要添加的唯一东西就是'Classification'的'xsl:apply-templates'的'xsl:sort'。 –

+0

@DevNull,谢谢,你说得对。由于'Bundles'看起来已经被BundleID排序了,所以我不打算添加任何排序。我们甚至可以假设可能有多个具有相同“BundleID”的Bundles,然后我们应该添加另一个级别的分组,但这离真正的XML文档太远了。 –

+0

@DimitreNovatchev谢谢! – Sr7