2017-08-02 19 views
-1

这里是一个示例XML我必须从xml转换为HTML。我需要找出其中有一个共同的价值元素,并把它合并到一个单一的表列在HTML

<?xml version='1.0' encoding='UTF-8'?> 
<message> 
<body> 
<asset> 

    <asset-id>test_01</asset-id> 
    <asset-name>report_test</asset-name> 
    <asset-version>1</asset-version> 
    <entity> 
    <id>project_test</id> 
     <entity-record> 
     <id>864d6141-712b-11e7-b775-f9304f8b3051#-</id> 
      <field> 
      <id>name</id> 
      <value>Transport</value> 
      </field> 
      <field> 
      <id>task</id> 
      <value>Person1</value> 
      </field> 
     </entity-record> 
     <entity-record> 
     <id>864d6141-812b-11e7-b775-f9304f8b3951#-</id> 
      <field> 
      <id>name</id> 
      <value>Transport</value> 
      </field> 
      <field> 
      <id>task</id> 
      <value>Person2</value> 
      </field> 
     </entity-record> 
     <entity-record> 
     <id>864d6141-712b-11e7-b775-f9314f8b3951#-</id> 
      <field> 
      <id>name</id> 
      <value>Food </value> 
      </field> 
      <field> 
      <id>task</id> 
      <value>Person3</value> 
      </field> 
     </entity-record> 
     <entity-record> 
     <id>864e6141-712b-11e7-b775-f9304f8b3951#-</id> 
      <field> 
      <id>name</id> 
      <value>Food</value> 
      </field> 
      <field> 
      <id>task</id> 
      <value>Person4</value> 
      </field> 
     </entity-record> 
     <entity-record> 
      <field> 
      <id>name</id> 
      <value>Food</value> 
      </field> 
      <field> 
      <id>task</id> 
      <value>Person5</value> 
      </field> 
     </entity-record> 
     <entity-record> 
      <field> 
      <id>name</id> 
      <value>Transport</value> 
      </field> 
      <field> 
      <id>task</id> 
      <value>Person3</value> 
      </field> 
     </entity-record> 
    </entity> 
</asset> 
</body> 
</message> 

这里是一个可怜的尝试我尝试使用Muenchian方法前两个细胞。

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" indent="yes"/> 
<xsl:key name="fieldbyid" match="field" use="value" /> 
<xsl:template match="message"> 
<html> 
<body> 
<table border="1"> 
    <tr> 
     <td>Project</td> 
     <td>Task</td> 
    </tr> 
    <tr> 
     <xsl:for-each select="body/asset/entity[id[text()='project_test']]/entity-record"> 
     <xsl:sort select="field[id[text()='name']]/value"/> 
     <xsl:for-each select="field[count(./value|key('fieldbyid','value')[1])=1]"> 
     <tr>     
      <td rowspan="{count(key('fieldbyid','value'))}"> 
      <xsl:value-of select="field[id[text()='name']]/value"/> 
      </td> 
      <td><xsl:value-of select="field[id[text()='task']]/value"/></td> 
     </tr> 
     </xsl:for-each> 
     </xsl:for-each> 
    </tr> 
</table> 
</body> 
</html> 
</xsl:template> 
</xsl:stylesheet> 

这里是输出我得到

<html> 
     <body> 
      <table border="1"> 
      <tr> 
       <td>Project</td> 
       <td>Task</td> 
      </tr> 
      <tr> 
       <tr> 
        <td>Food</td> 
        <td rowspan="0"></td> 
        <td></td> 
       </tr> 
       <tr> 
        <td>Person4</td> 
        <td rowspan="0"></td> 
        <td></td> 
       </tr> 
       <tr> 
        <td>Food</td> 
        <td rowspan="0"></td> 
        <td></td> 
       </tr> 
       <tr> 
        <td>Person5</td> 
        <td rowspan="0"></td> 
        <td></td> 
       </tr> 
       <tr> 
        <td>Food </td> 
        <td rowspan="0"></td> 
        <td></td> 
       </tr> 
       <tr> 
        <td>Person3</td> 
        <td rowspan="0"></td> 
        <td></td> 
       </tr> 
       <tr> 
        <td>Transport</td> 
        <td rowspan="0"></td> 
        <td></td> 
       </tr> 
       <tr> 
        <td>Person1</td> 
        <td rowspan="0"></td> 
        <td></td> 
       </tr> 
       <tr> 
        <td>Transport</td> 
        <td rowspan="0"></td> 
        <td></td> 
       </tr> 
       <tr> 
        <td>Person2</td> 
        <td rowspan="0"></td> 
        <td></td> 
       </tr> 
       <tr> 
        <td>Transport</td> 
        <td rowspan="0"></td> 
        <td></td> 
       </tr> 
       <tr> 
        <td>Person3</td> 
        <td rowspan="0"></td> 
        <td></td> 
       </tr> 
      </tr> 
      </table> 
     </body> 
    </html> 

这是我多么希望我的输出看, enter image description here enter image description here 在去除第二for循环,即保持代码出于对循环,<xsl:for-each select="field[count(./value|key('fieldbyid','value')[1])=1]">它似乎至少显示值。 这个声明究竟意味着什么? 也值“。”。显示id和value都是我在这种情况下使用./value的原因。 任何帮助将是伟大的! 感谢

+0

我不明白你想要输出什么 - 请用单词解释逻辑。 - 如果您可以使用XSLT 2.0,那么为什么不使用'xsl:for-each-group'而不是Muenchian分组? –

+0

而我在您的输入中看不到任何金额。 –

回答

0

如果你确实使用XSLT 2.0处理器,然后尝试以此为起点:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="html" indent="yes"/> 

<xsl:template match="/message"> 
    <html> 
     <body> 
      <table border="1"> 
       <tr> 
        <th>Project</th> 
        <th>Task</th> 
       </tr> 
       <!-- group by name --> 
       <xsl:for-each-group select="body/asset/entity/entity-record" group-by="field[id='name']/value"> 
        <xsl:variable name="tasks"> 
         <!-- group by task --> 
         <xsl:for-each-group select="current-group()" group-by="field[id='task']/value"> 
          <tr> 
           <td> 
            <xsl:value-of select="current-grouping-key()" /> 
           </td> 
          </tr> 
         </xsl:for-each-group>  
        </xsl:variable> 
        <tr> 
         <td rowspan="{1 + count($tasks/tr)}"> 
          <xsl:value-of select="current-grouping-key()" /> 
         </td> 
        </tr> 
        <xsl:copy-of select="$tasks"/> 
       </xsl:for-each-group>    
      </table> 
     </body> 
    </html> 
</xsl:template> 

</xsl:stylesheet> 

输出应该是这个样子:

enter image description here

这是在调整你的输入例子t o删除<value>Food </value>的额外空间。

相关问题