【问题标题】:XSL group by multiple conditionsXSL 按多个条件分组
【发布时间】:2015-04-29 12:54:52
【问题描述】:

我想先按某个元素值对项目进行分组,然后将结果项目按其他元素值与“或”条件进行分组。

我将尝试用下面的 XML 示例来解释自己

<root>

    <request>
        <id_master>222</id_master>
        <id_x>1</id_x>
        <text>hey</text>
    </request>

    <response>
        <id_master>222</id_master>
        <id_y>1</id_y>
        <text>hello</text>
    </response>

    <request>
        <id_master>222</id_master>
        <id_y>1</id_y>
        <text>bye..</text>
    </request>

    <response>
        <id_master>222</id_master>
        <id_x>1</id_x>
        <text>bye</text>
    </response>

    <request>
        <id_master>222</id_master>
        <id_y>2</id_y>
        <text>I want ice..</text>
    </request>

    <response>
        <id_master>222</id_master>
        <id_x>2</id_x>
        <text>OK</text>
    </response>


    <request>
        <id_master>333</id_master>
        <id_y>5</id_y>
        <text>my name is</text>
    </request>

    <response>
        <id_master>333</id_master>
        <id_x>5</id_x>
        <text>alice</text>
    </response>

    <response>
        <id_master>333</id_master>
        <id_x>5</id_x>
        <text>I'm bob</text>
    </response> 

</root>

现在,在上面的 XML 文件中,我有以下 IDS: 1. id_master 2.id_x 3. id_y

首先,我想按 id_master 对每个块元素进行分组。 然后将结果按 id_x 或 id_y 分组,所以输出文件应该是:

<div>
    <h1>Conversation id 222</h1>
    <p>[1] hey</p>
    <p>[1] hello</p>
    <p>[1] bye..</p>
    <p>[1] bye</p>
</div>

<div>
    <h1>Conversation id 222</h1>
    <p>[2] I want ice..</p>
    <p>[2] OK</p>
</div>


<div>
    <h1>Conversation id 333</h1>
    <p>[2] my name is</p>
    <p>[2] alice </p>
    <p>[2] I'm bob </p>
</div>

我成功将第一部分分组(按 id_master 分组) 我在分组第二部分时遇到了麻烦......

这是我目前得到的:

<xsl:key name="key_group_by_master" match="*"  use="id_master" />
<xsl:key name="key_group_by_slave" match="*"  use="id_x or id_y" />

<!-- Group all master elements -->
<xsl:for-each select="//*[generate-id(.)=generate-id(key('key_group_by_master', id_master)[1])]">

    <div>
        <h1> Conversation id <xsl:value-of select="id_master"/> </h1>

        <!-- What I'm doing wrong here ?? Need help ... -->
        <xsl:for-each select="//*[generate-id(.)=generate-id(key('key_group_by_slave', id_x or id_y)[1])]">
            <p> [<xsl:value-of select="id_x or id_y"/>] <xsl:value-of select="text"/> </p>
        </xsl:for-each>
    </div>

</xsl:for-each>

使用 XSLT 1.0

【问题讨论】:

    标签: xml xslt xslt-1.0


    【解决方案1】:

    我将第一个键定义为

    <xsl:key name="key_group_by_master" match="root/*" use="id_master"/>
    

    然后第二个需要将主密钥与从密钥连接起来,例如

    <xsl:key name="slave" match="root/*" use="concat(id_master, '|', id_x | id_y)"/>
    

    内部的 for-each 然后需要是

        <xsl:for-each select="//*[generate-id(.)=generate-id(key('slave', concat(id_master, '|', id_x | id_y))[1])]">
    

    只要元素只有 id_xid_y 而不是两者都应该这样做。

    【讨论】:

    • 感谢您的快速回答,我现在就试试。关于 id_x 和 id_y,当我有 id_x 和 id_y 但具有不同的值时,我会遇到这样的情况..
    • 如果单个元素可以同时具有id_xid_y,那么我认为您需要确保键具有concat(id_master, '|', id_x, '|', id_y),因为这会使键成为三个元素值的串联由分隔符 (|) 分隔。
    猜你喜欢
    • 1970-01-01
    • 2013-12-06
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 2020-12-19
    相关资源
    最近更新 更多