XSL 2.0合并/分组具有相同子值的两个不同节点元素

时间:2014-12-13 21:42:58

标签: xml xslt merge xslt-1.0

我是XSLT 1.0的新手, 我想将具有相同值的两个不同元素合并/分组到表中。

XML输入

<transaction>
    <request_id> 1 </request_id>
    <message> Hi </message>
</transaction>


<transaction>
    <response_id> 1 </response_id>
    <message> Hola </message>
</transaction>

<transaction>
    <request_id> 2 </request_id>
    <message> bye </message>
</transaction>

<transaction>
    <response_id> 2 </response_id>
    <message> bye bye </message>
</transaction>

我想要下表

<table>
    <thead>
        <th> ID </th>
        <th> request </th>
        <th> response </th>
    </thead>
    <tbody>
        <tr>
            <td> 1 </td>
            <td> Hi </td>
            <td> Hola </td>
        </tr>
        <tr>
            <td> 2 </td>
            <td> bye </td>
            <td> bye bye </td>
        </tr>
    </tbody>
</table>

我在这里找到了如何按值合并元素的解决方案,但它总是使用相同的元素名称, 有什么建议吗?

1 个答案:

答案 0 :(得分:0)

给出格式良好的输入

<root>
    <transaction>
        <request_id> 1 </request_id>
        <message> Hi </message>
    </transaction>

    <transaction>
        <response_id> 1 </response_id>
        <message> Hola </message>
    </transaction>

    <transaction>
        <request_id> 2 </request_id>
        <message> bye </message>
    </transaction>

    <transaction>
        <response_id> 2 </response_id>
        <message> bye bye </message>
    </transaction>
</root>

以下样式表:

XSLT 1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:key name="response" match="transaction" use="response_id" />

<xsl:template match="/">
    <table>
        <thead>
            <th>ID</th>
            <th>Request</th>
            <th>Response</th>
        </thead>
        <tbody>
            <xsl:for-each select="root/transaction[request_id]">
                <tr>
                    <td><xsl:value-of select="request_id"/></td>
                    <td><xsl:value-of select="message"/></td>
                    <td><xsl:value-of select="key('response', request_id)/message"/></td>
                </tr>
            </xsl:for-each>
        </tbody>
    </table>
</xsl:template>

</xsl:stylesheet>

将返回请求的结果。

这假设每个唯一ID都有一对事务(请求和响应)。

在这种情况下,解决方案与XSLT 1.0或2.0相同。