gpt4 book ai didi

xml - Muenchian 分组 - 在节点内分组,而不是在整个文档内分组

转载 作者:数据小太阳 更新时间:2023-10-29 02:49:32 24 4
gpt4 key购买 nike

我试图在我的 XSLT 中使用 Muenchian 分组来对匹配的节点进行分组,但我只想在父节点内进行分组,而不是在整个源 XML 文档中进行分组。

给定 XSLT 和 XML 如下(对我的示例代码的长度表示歉意):

XSLT

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="html" indent="yes"/>

<xsl:key name="contacts-by-surname" match="contact" use="surname" />
<xsl:template match="records">
<xsl:for-each select="contact[count(. | key('contacts-by-surname', surname)[1]) = 1]">
<xsl:sort select="surname" />
<xsl:value-of select="surname" />,<br />
<xsl:for-each select="key('contacts-by-surname', surname)">
<xsl:sort select="forename" />
<xsl:value-of select="forename" /> (<xsl:value-of select="title" />)<br />
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

XML

<root>
<records>
<contact id="0001">
<title>Mr</title>
<forename>John</forename>
<surname>Smith</surname>
</contact>
<contact id="0002">
<title>Dr</title>
<forename>Amy</forename>
<surname>Jones</surname>
</contact>
<contact id="0003">
<title>Mrs</title>
<forename>Mary</forename>
<surname>Smith</surname>
</contact>
<contact id="0004">
<title>Ms</title>
<forename>Anne</forename>
<surname>Jones</surname>
</contact>
<contact id="0005">
<title>Mr</title>
<forename>Peter</forename>
<surname>Smith</surname>
</contact>
<contact id="0006">
<title>Dr</title>
<forename>Indy</forename>
<surname>Jones</surname>
</contact>
</records>
<records>
<contact id="0001">
<title>Mr</title>
<forename>James</forename>
<surname>Smith</surname>
</contact>
<contact id="0002">
<title>Dr</title>
<forename>Mandy</forename>
<surname>Jones</surname>
</contact>
<contact id="0003">
<title>Mrs</title>
<forename>Elizabeth</forename>
<surname>Smith</surname>
</contact>
<contact id="0004">
<title>Ms</title>
<forename>Sally</forename>
<surname>Jones</surname>
</contact>
<contact id="0005">
<title>Mr</title>
<forename>George</forename>
<surname>Smith</surname>
</contact>
<contact id="0006">
<title>Dr</title>
<forename>Harry</forename>
<surname>Jones</surname>
</contact>
</records>
</root>

结果

Jones,
Amy (Dr)
Anne (Ms)
Harry (Dr)
Indy (Dr)
Mandy (Dr)
Sally (Ms)

Smith,
Elizabeth (Mrs)
George (Mr)
James (Mr)
John (Mr)
Mary (Mrs)
Peter (Mr)

如何在每个 <records> 中分组并实现这个结果:

Jones,
Amy (Dr)
Anne (Ms)
Indy (Dr)

Smith,
John (Mr)
Mary (Mrs)
Peter (Mr)

Jones,
Harry (Dr)
Mandy (Dr)
Sally (Ms)

Smith,
Elizabeth (Mrs)
George (Mr)
James (Mr)

最佳答案

花了我一些时间......我正要放弃但仍然继续:)

键函数的缺点是生成的键总是针对整个xml。因此,您应该在 key 中连接其他信息以使其更具体。在例如下面,我连接了记录节点的位置,以便为每条记录获取不同姓氏的键。

这是 xslt:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="html" indent="yes"/>
<xsl:key name="distinct-surname" match="contact" use="concat(generate-id(..), '|', surname)"/>
<xsl:template match="records">
<xsl:for-each select="contact[generate-id() = generate-id(key('distinct-surname', concat(generate-id(..), '|', surname))[1])]">
<xsl:sort select="surname" />
<xsl:value-of select="surname" />,<br />
<xsl:for-each select="key('distinct-surname', concat(generate-id(..), '|', surname))">
<xsl:sort select="forename" />
<xsl:value-of select="forename" /> (<xsl:value-of select="title" />)<br />
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

这是结果:

Jones,
Amy (Dr)
Anne (Ms)
Indy (Dr)
Smith,
John (Mr)
Mary (Mrs)
Peter (Mr)
Jones,
Harry (Dr)
Mandy (Dr)
Sally (Ms)
Smith,
Elizabeth (Mrs)
George (Mr)
James (Mr)

请注意,结果也是按名字排序的。如果不想按名字排序,则需要删除 <xsl:sort select="forename" />

关于xml - Muenchian 分组 - 在节点内分组,而不是在整个文档内分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1753485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com