XSLT 1.0 用于迭代多个具有逗号分隔值的 XML 元素
我有一个 XML 文档,结构如下
<items>
<item>
<name>item1</name>
<attributes>a,b,c,d</attributes>
</item>
<item>
<name>item2</name>
<attributes>c,d,e</attributes>
</item>
</items>
对于每个唯一的属性值(以逗号分隔),我需要列出与该值关联的所有项目名称,如下所示:
a : item1
b : item1
c : item1, item2
d : item1, item2
e : item2
我最初的计划是使用模板将属性解析为属性节点,围绕每个属性使用适当的标签,然后使用 XPATH 表达式分离出唯一值
Attribute[not(.=following::Attribute)]
,但由于模板的结果不是经过 XML 解析器的节点集,因此我无法遍历它。我还尝试了 exslt 的 node-set() 函数,结果发现它也不允许我遍历各个属性节点。
此时,我不知道有什么简单的方法可以做到这一点,并且非常感谢有关如何继续的任何帮助或想法。谢谢!
I have an XML document structured as follows
<items>
<item>
<name>item1</name>
<attributes>a,b,c,d</attributes>
</item>
<item>
<name>item2</name>
<attributes>c,d,e</attributes>
</item>
</items>
For each unique attribute value (delimited by commas) I need to list all item names associated with that value like so:
a : item1
b : item1
c : item1, item2
d : item1, item2
e : item2
My initial plan was to use a template to parse the attributes into Attribute nodes, surrounding each with appropriate tags, and then separating out the unique values with an XPATH expression like
Attribute[not(.=following::Attribute)]
but since the result of the template isn't a node-set that ever goes through an XML parser, I can't traverse it. I also tried exslt's node-set() function only to realize it does not allow me to traverse the individual Attribute nodes either.
At this point I'm at a loss for a simple way to do this and would really appreciate any help or ideas on how to proceed. Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
此转换:
应用于提供的 XML 文档时:
产生所需的正确结果:
说明:
.2。 Pass2 将 Pass1 的结果(使用扩展函数 ext:node-set() 转换为节点集)作为输入,执行 Muenchian 分组并生成最终的所需结果。
This transformation:
when applied on the provided XML document:
produces the wanted, correct result:
Explanation:
.2. Pass2 takes the result of Pass1 (converted to a nodeset using the extension function
ext:node-set()
) as input, performs Muenchian grouping and produces the final, wanted result.我的第一个想法是进行两次传递。首先,使用(稍微)修改版本的 @Alejandro 对上一个问题的回答:
生成:
然后将以下样式表应用于该输出:
生成:
在一个样式表中执行此操作需要更多思考(或扩展函数)。
My first thought is to make two passes. First, tokenize the
attributes
elements using a (slightly) modified version of @Alejandro's answer to this previous question:Which produces:
Then apply the following stylesheet to that output:
Producing:
Doing this in one stylesheet would require more thought (or an extension function).