如何使用 XSLT 对值进行排序?
我有一个与此类似的 XML:
<Test>
<grapes>
<a>TypeA</a>
<b>value1</b>
</grapes>
<oranges>
<a>TypeB</a>
<b>value2</b>
</oranges>
<apples>
<a>TypeA</a>
<b>value3</b>
</apples>
</Test>
其中值是唯一的,但类型可能相同。
我试图对其进行排序,以便输出与此类似:
<group type="TypeA">
<value v="value1" />
<value v="value3" />
</group>
<group type="TypeB">
<value v="value2" />
</group>
我很难确保输出中的组是唯一的并且值位于正确的组中。
我的 XSL 应该如何构建?
I have an XML similar to this:
<Test>
<grapes>
<a>TypeA</a>
<b>value1</b>
</grapes>
<oranges>
<a>TypeB</a>
<b>value2</b>
</oranges>
<apples>
<a>TypeA</a>
<b>value3</b>
</apples>
</Test>
where the values are unique but the Type, might be the same.
I am trying to sort it so that the output is similar to this:
<group type="TypeA">
<value v="value1" />
<value v="value3" />
</group>
<group type="TypeB">
<value v="value2" />
</group>
I am having a hard time making sure the groups are unique in the output and the values are in the right group.
How should my XSL be structured?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这是一个更简单的解决方案(完全“推送式”,没有,没有嵌套,没有
)
,无current()
,,无//
,无轴):当此转换应用于提供的 XML 文档时 :
通缉者,产生正确的结果:
解释:
/*/*
的慕尼黑分组,使用其a
子项的字符串值作为键。二. XSLT 2.0 解决方案:
当对同一个 XML 文档(上面)执行此转换时,会产生相同的正确结果:
说明:
current-group()
>current-grouping-key()
Here is a much simpler solution (completely "push style", no
<xsl:for-each>
, no nesting, no<xsl:variable>
, nocurrent()
, , no//
, no axes):when this transformation is applied on the provided XML document:
the wanted, correct result is produced:
Explanation: Muenchian grouping of
/*/*
using as key the string values of theira
children.II. XSLT 2.0 solution:
When this transformation is performed on the same XML document (above), the same correct result is produced:
Explanation:
<xsl:for-each-group>
current-group()
current-grouping-key()
XSLT 1.0:
首先使用 muenchian 方法为您的类型创建唯一的组。谷歌一下就知道它是什么。然后,只需迭代它们并打印出您想要的内容、您想要的方式:
您会发现输出与您期望的相同。
XSLT 1.0 :
You start by creating unique groups for your types using the muenchian method. Google it to find out what it is. Then it's just a matter of iterating through them and printint out what you want, how you want it :
You will find that the output is identical to what you expect.
我的建议与 FailedDev 的略有不同:
外部
选择所有唯一类型,即。 类型A和类型B。
根据名称对它们进行排序
,确保 TypeA 将出现在 TypeB 上方。
内部
为每种类型选择唯一值的列表,即。对于TypeA,提取值value1和value3。同样,结果列表排序为在 value3 之前列出 value1。
My proposal is slightly different from FailedDev's:
The outer
select all unique types, ie. TypeA and TypeB.
The
sorts these according to name, making sure TypeA will appear above TypeB.
The inner
selects a list of unique values for each type, ie. for TypeA the values value1 and value3 are extracted. Again, the resulting list is sorted to list value1 before value3.