【发布时间】:2015-02-07 05:19:59
【问题描述】:
我需要一些帮助来制作 xsl 地图文件。 我有一个输入。这包含一些项目的列表:
<root>
<resultListIn>
<resultItemIn>
<a>aaa</a>
<b>bbb</b>
<c>ccc1</c>
</resultItemIn>
<resultItemIn>
<a>aaa</a>
<b>bbb</b>
<c>ccc2</c>
</resultItemIn>
<resultItemIn>
<a>aab</a>
<b>bbb</b>
<c>ccc3</c>
</resultItemIn>
<resultItemIn>
<a>aaa</a>
<b>bbc</b>
<c>ccc4</c>
</resultItemIn>
<resultItemIn>
<a>aaa</a>
<b>bbc</b>
<c>ccc5</c>
</resultItemIn>
</resultListIn>
</root>
现在我想把它转换成一个看起来像地图的结构:我们的“关键”将是 和 元素(来自每个 resultItem),值将是 来自具有相同 和 值的每个
所以输出应该看起来像(您可以在正确的 resultItem 的
<resultroot>
<resultListOut>
<resultItem>
<a>aaa</a>
<b>bbb</b>
<cItemList>
<c>cc1</c>
<c>cc2</c>
</cItemList>
</resultItem>
<resultItem>
<a>aab</a>
<b>bbb</b>
<cItemList>
<c>cc3</c>
</cItemList>
</resultItem>
<resultItem>
<a>aaa</a>
<b>bbc</b>
<cItemList>
<c>cc4</c>
<c>cc5</c>
</cItemList>
</resultItem>
</resultListOut>
</resultroot>
你们能帮我解决这个问题吗?我不需要完整的 xsl 代码,只需要一些指导,关于如何从哪里开始,我应该写什么样的算法的建议。我真的不知道如何在 xsl 中实现这一点(遗憾的是我不能使用 Java)。
我试图用 for-each 结构来考虑它,但在我看来这是一团糟。
提前致谢, 汤姆
【问题讨论】:
-
这是一个分组问题。进行搜索 - 这是这里最常被问到的问题之一。请注意,XSLT 1.0 或 2.0 的答案是不同的。
-
要扩展它,如果您使用 XSLT 1.0,请搜索“Muenchian grouping”,如果使用 2.0,请搜索 xsl:for-each-group。 2.0 解决方案会容易得多。在尝试将其扩展为复合键之前,您可能会尝试使用简单键(仅一个元素)。
-
谢谢你们俩。关键字“分组”对我来说是关键。使用它我也发现了 muenchian 分组(以及很多例子)。 michael.hor257 请回答这个问题,我会给你要点 :) Michael Kay:我需要复合键,因为在我的真实模式中,元素“a”和“b”是“邮政编码”和“城镇”,并且我需要两者来识别,但谢谢你的观点!
-
邮政编码本身不是唯一的吗?
-
@michael.hor257k 不一定。我在一个与其他两个城镇共享邮政编码的城镇长大。