XSLT 1.0:分组和删除重复项
我有一个 xml 分组挑战,需要对其进行分组并删除重复项,如下所示:
<Person>
<name>John</name>
<date>June12</date>
<workTime taskID=1>34</workTime>
<workTime taskID=1>35</workTime>
<workTime taskID=2>12</workTime>
</Person>
<Person>
<name>John</name>
<date>June13</date>
<workTime taskID=1>21</workTime>
<workTime taskID=2>11</workTime>
<workTime taskID=2>14</workTime>
</Person>
请注意,对于名称/任务 ID/日期的特定出现,仅选取第一个。 在此示例中,
<workTime taskID=1>35</workTime>
<workTime taskID=2>14</workTime>
将被放在一边。
下面是预期的输出:
<Person>
<name>John</name>
<taskID>1</taskID>
<workTime>
<date>June12</date>
<time>34</time>
</worTime>
<workTime>
<date>June13</date>
<time>21</time>
</worTime>
</Person>
<Person>
<name>John</name>
<taskID>2</taskID>
<workTime>
<date>June12</date>
<time>12</time>
</worTime>
<workTime>
<date>June13</date>
<time>11</time>
</worTime>
</Person>
我尝试使用下面的键在 XSLT 1.0 中使用 muenchian 分组:
<xsl:key name="PersonTasks" match="workTime" use="concat(@taskID, ../name)"/>
但是如何只选取第一次出现的
concat(@taskID, ../name, ../date)
? 看来我需要两级钥匙!?
I have a xml grouping challenge for which I need to group AND remove duplicate as below:
<Person>
<name>John</name>
<date>June12</date>
<workTime taskID=1>34</workTime>
<workTime taskID=1>35</workTime>
<workTime taskID=2>12</workTime>
</Person>
<Person>
<name>John</name>
<date>June13</date>
<workTime taskID=1>21</workTime>
<workTime taskID=2>11</workTime>
<workTime taskID=2>14</workTime>
</Person>
Note that for a specific occurence of name/taskID/date, only the first one is picked up.
In this example,
<workTime taskID=1>35</workTime>
<workTime taskID=2>14</workTime>
would be left aside.
Below is the expected output:
<Person>
<name>John</name>
<taskID>1</taskID>
<workTime>
<date>June12</date>
<time>34</time>
</worTime>
<workTime>
<date>June13</date>
<time>21</time>
</worTime>
</Person>
<Person>
<name>John</name>
<taskID>2</taskID>
<workTime>
<date>June12</date>
<time>12</time>
</worTime>
<workTime>
<date>June13</date>
<time>11</time>
</worTime>
</Person>
I have tried to use a muenchian grouping in XSLT 1.0 using the key below:
<xsl:key name="PersonTasks" match="workTime" use="concat(@taskID, ../name)"/>
but then how do I only pick up the first occurence of
concat(@taskID, ../name, ../date)
?
It seems that I need two level of keys!?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
此转换:
应用于提供的 XML 时(纠正多个问题以使其格式正确):
产生所需的正确结果:
< strong>解释:
首先我们获取所有具有唯一对
../name
、@taskID
的workTime
元素code> 使用 Muenchian 方法进行分组。我们按
../name
和@taskID
对它们进行排序 - 按此顺序。对于每个这样的
workTime
,我们获取以../name
列出的所有date
元素此workTime
并仅保留这些date
元素,其中存在一个具有相同../date< 的
workTime
/code> 和../name
。在上一步中,我们使用两个不同的辅助键:
'kDateByName'
通过../ 索引所有
,而date
元素name'kwrkTimeByNameTaskDate'
按../name
和../date 索引所有
及其workTime
元素@taskID
。因此,以下内容的含义:
是:
对于每个
日期
对于那个名称
,这样一个工作时间
为此姓名
、日期
和@taskID
(当前工作时间
外部
) 存在,执行该指令正文中的任何操作
指令。This transformation:
when applied on the provided XML (corrected from multiple issues to become well-formed):
produces the wanted, correct result:
Explanation:
First we obtain all
workTime
elements with unique pairs of../name
,@taskID
by using the Muenchian method for grouping.We sort these by
../name
and@taskID
-- in that order.For each such
workTime
we get alldate
elements that are listed with the../name
of thisworkTime
and leave only those of thesedate
elements, for which there is aworkTime
that has the same../date
and../name
.In the previous step we use two different auxiliary keys:
'kDateByName'
indexes alldate
elements by their../name
, while'kwrkTimeByNameTaskDate'
indexes allworkTime
elements by their../name
, their../date
and their@taskID
.So, the meaning of the following:
is:
For each
date
for thatname
, such that aworkTime
for thatname
,date
and@taskID
(of the currentworkTime
for the outer<xsl:for-each>
) exists, do whatever is in the body of this<xsl:for-each>
instruction.只是为了好玩,另一个带有两把钥匙的解决方案。该样式表:
输出:
Just for fun, another solutions with two keys. This stylesheet:
Output:
XSLT 中的分组通常使用称为 Muenchian 方法的方法来完成。在这里查找更多数据:http://www.jenitennison.com/xslt/grouping/muenchian .html
Grouping in XSLT is usually done using a method called the Muenchian method. Find more data here: http://www.jenitennison.com/xslt/grouping/muenchian.html