2014-12-03 80 views
0

我有以下XML結構:XSL分組兩種不同的屬性

<table> 
    <field1>User 1</field1> 
    <field2>xyz</field2> 
    <field3>xyz</field3> 
</table> 
<table> 
    <field1>User 2</field1> 
    <field2>abc</field2> 
    <field3>xyz</field3> 
</table> 
<table> 
    <field1>User 3</field1> 
    <field2>def</field2> 
    <field3>xyz</field3> 
</table> 
<table> 
    <field1>User 2</field1> 
    <field2>def</field2> 
    <field3>xyz</field3> 
</table> 

的XML有幾個100表條目。 這些屬性可以在字段2或字段3中或兩者中。

我需要一個輸出,它將用戶以及字段2和3中的屬性分組到表中。

<table border="1" cellspacing="0" cellpadding="0"> 
<tr> 
    <td>Users</td> 
    <td>abc</td> 
    <td>def</td> 
    <td>xyz</td> 
</tr> 
<tr> 
    <td>User 1</td> 
    <td> </td> 
    <td> </td> 
    <td>2</td> 
</tr> 
<tr> 
    <td>User 2</td> 
    <td>1</td> 
    <td>1</td> 
    <td>2</td> 
</tr> 
<tr> 
    <td>User 3</td> 
    <td> </td> 
    <td>1</td> 
    <td>1</td> 
</tr> 

在第二步驟中我不得不計數的值,但是這是一個其他主題。

我只能使用XSLT 1.0,不幸的是我不知道如何將字段2和3的值分組?

非常感謝您的支持!

+1

請編輯您的代碼示例,以便它是格式良好的XML,目前尚不清楚這名和值的屬性都有。 – 2014-12-03 21:14:10

+0

我同意@MartinHonnen。最重要的是:這些字段有不同的名字嗎? – 2014-12-03 21:20:19

+0

感謝您的回答,我在這裏貼上原始XML源代碼的一個非常簡單的翻譯。最重要的是,正如@ michael.hor257k所要求的那樣,這些字段在XML源代碼中有不同的名稱。這就是爲什麼我有問題來組「場2和場3」的原因。非常感謝和問候,克勞斯 – Claus 2014-12-04 15:04:25

回答

0

假設你有一個合式輸入像這樣:

<input> 
    <object> 
     <name>User 1</name> 
     <color1>Red</color1> 
     <color2>Red</color2> 
    </object> 
    <object> 
     <name>User 2</name> 
     <color1>Green</color1> 
     <color2>Red</color2> 
    </object> 
    <object> 
     <name>User 3</name> 
     <color1>Blue</color1> 
     <color2>Red</color2> 
    </object> 
    <object> 
     <name>User 2</name> 
     <color1>Blue</color1> 
     <color2>Red</color2> 
    </object> 
</input> 

應用以下樣式:

XSLT 1.0

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:exsl="http://exslt.org/common" 
extension-element-prefixes="exsl"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:key name="object" match="object" use="name" /> 
<xsl:key name="color" match="color1 | color2" use="." /> 
<xsl:key name="color-by-object" match="color1 | color2" use="concat(../name, '|', .)" /> 

<xsl:variable name="columns"> 
    <xsl:for-each select="(input/object/color1 | input/object/color2)[count(. | key('color', .)[1]) = 1]"> 
     <color><xsl:value-of select="."/></color> 
    </xsl:for-each> 
</xsl:variable> 
<xsl:variable name="col-set" select="exsl:node-set($columns)" /> 

<xsl:variable name="rows"> 
    <xsl:for-each select="input/object[count(. | key('object', name)[1]) = 1]"> 
     <xsl:copy-of select="name"/> 
    </xsl:for-each> 
</xsl:variable> 
<xsl:variable name="row-set" select="exsl:node-set($rows)" /> 

<xsl:variable name="root" select="/" /> 

<xsl:template match="/input"> 
    <table border="1"> 
     <tr> 
      <th/> 
      <xsl:for-each select="$col-set/color"> 
       <th><xsl:value-of select="."/></th> 
      </xsl:for-each> 
     </tr> 
     <xsl:for-each select="$row-set/name"> 
      <xsl:variable name="object" select="." /> 
      <tr> 
       <th><xsl:value-of select="$object"/></th> 
       <xsl:for-each select="$col-set/color"> 
        <xsl:variable name="color" select="." /> 
        <!-- switch to document in order to use key --> 
        <xsl:for-each select="$root"> 
         <td><xsl:value-of select="count(key('color-by-object', concat($object, '|', $color)))"/></td> 
        </xsl:for-each> 
       </xsl:for-each> 
      </tr> 
     </xsl:for-each> 
    </table> 
</xsl:template> 

</xsl:stylesheet> 

結果在:

<?xml version="1.0" encoding="UTF-8"?> 
<table border="1"> 
    <tr> 
     <th/> 
     <th>Red</th> 
     <th>Green</th> 
     <th>Blue</th> 
    </tr> 
    <tr> 
     <th>User 1</th> 
     <td>2</td> 
     <td>0</td> 
     <td>0</td> 
    </tr> 
    <tr> 
     <th>User 2</th> 
     <td>2</td> 
     <td>1</td> 
     <td>1</td> 
    </tr> 
    <tr> 
     <th>User 3</th> 
     <td>1</td> 
     <td>0</td> 
     <td>1</td> 
    </tr> 
</table> 

呈現爲:

enter image description here

+0

非常感謝您的支持@ michael.hor257k!我會嘗試這個建議並給你反饋。BR – Claus 2014-12-04 15:49:06

+0

正如你寫的@ Michael.hor257k所提出的解決方案正在做我所需要的! – Claus 2014-12-04 19:45:33

+0

但不幸的是,我不理解爲什麼在密鑰中需要「名稱」的連接? – Claus 2014-12-04 19:53:33