XSL 按多个条件分组
XSL group by multiple conditions
我想先按某个元素值对项目进行分组,然后使用 'or' 条件按其他元素值对结果项目进行分组。
我将尝试用以下 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
我会将第一个键定义为
<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_x
或 id_y
而不是两者都应该这样做。
我想先按某个元素值对项目进行分组,然后使用 'or' 条件按其他元素值对结果项目进行分组。
我将尝试用以下 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
我会将第一个键定义为
<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_x
或 id_y
而不是两者都应该这样做。