Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我必须将xml转换为HTML。我需要识别具有公共值的元素,并将其合并到HTML中的单个表列中_Xml_Xslt 1.0_Xslt 2.0_Xslt Grouping - Fatal编程技术网

我必须将xml转换为HTML。我需要识别具有公共值的元素,并将其合并到HTML中的单个表列中

我必须将xml转换为HTML。我需要识别具有公共值的元素,并将其合并到HTML中的单个表列中,xml,xslt-1.0,xslt-2.0,xslt-grouping,Xml,Xslt 1.0,Xslt 2.0,Xslt Grouping,下面是一个示例XML <?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>

下面是一个示例XML

<?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>

在删除第二个for循环时,即保持代码不在for循环中,
它似乎至少显示了值。 这句话到底是什么意思? 在“.”的值上也显示id和值,这就是我在本例中使用./value的原因。 任何帮助都会很好!
谢谢

如果您确实在使用XSLT 2.0处理器,那么请尝试将此作为起点:

XSLT2.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>

项目
任务
输出应如下所示:


这是在调整您的输入示例以删除
食品中的多余空间之后,我不明白您想要什么作为输出-请用文字解释逻辑。--如果您可以使用XSLT2.0,那么为什么不使用
xsl:for each group
而不是Muenchian分组呢?而且我在您的输入中看不到任何数量。
<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>
<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>