【问题标题】:XSL 2.0 merge/group two diffrent nodes elements with same child valueXSL 2.0 合并/分组两个具有相同子值的不同节点元素
【发布时间】:2014-12-13 21:42:58
【问题描述】:

我是 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>

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

【问题讨论】:

  • 您的主题说 XSL 2.0,您的文本 1.0。那你用的是哪个版本?
  • 你是否总是(最多)两个事务——请求和响应——具有相同的 id? -- 另请注意,您的 XML 输入必须有一个根元素。

标签: xml xslt merge xslt-1.0


【解决方案1】:

给定一个格式良好的输入

<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 相同。

【讨论】:

    猜你喜欢
    • 2021-07-23
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 2019-07-29
    相关资源
    最近更新 更多