使用 xslt 删除 xml 中的重复项
我需要删除以下 xml 中的重复项:
<ListOfRowIDWithListOfBooks xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/">
<RowIDWithListOfBooks>
<Row_ID>ADOA-XssK</Row_ID>
<ListOfBookInfo>
<book>
<BookType>Brand</BookType>
<BookName>jon</BookName>
</book>
<book>
<BookType>Brand</BookType>
<BookName>jon</BookName>
</book>
</ListOfBookInfo>
</RowIDWithListOfBooks>
</ListOfRowIDWithListOfBooks>
有人可以帮忙吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
使用标准分组解决方案可以轻松完成此任务。不要使用单个 select 语句来执行众所周知会导致性能问题的操作。
注意对
identity.xsl
的引用只是将众所周知的身份转换模板。[XSLT 1.0]
[XSLT 2.0]
This task can be easily achieved using standard grouping solutions. Do not use single select statements to do that which are well known to cause performance problems.
Note The reference to
identity.xsl
just include into the stylesheet the well known identity transformation template.[XSLT 1.0]
[XSLT 2.0]
试试这个 XSLT:
它将选择具有唯一
BookType
和BookName
的book
。在您的示例中,结果应该是:Try this XSLT:
It will select
book
s with uniqueBookType
andBookName
. In your sample result should be:您需要使用 Muenchian 分组方法将它们分组在一起。或者 xslt 2.0 中更具体的分组函数。以下是两个相关的堆栈溢出问题:
如何在 xslt 中使用 group by
如何使用 XSLT 输出重复元素?
You need to group them together using the Muenchian grouping method. Or the more specific grouping functions in xslt 2.0. Here are two relevant stack overflow questions:
How to use group by in xslt
How to output duplicate elements using XSLT?
如果您对如何使用 Muenchian 分组(XSLT 中的常用技术)来实现这一点感兴趣,那么您首先需要定义一个“键”来识别行中的重复书籍。
在此,我使用 RowID、BookType 和 BookName 的串联键来实现此目的。该密钥将包含所有具有该特定密钥值的书籍列表。请注意使用 # 字符作为连接字符。如果 # 有可能出现在您的 XML 中,您将需要选择另一个字符(或字符串)。
现在,当您匹配 book 元素时,您可以像这样检查重复项
。换句话说,这个 book 元素是我们键中的第一个元素吗?
这是完整的 XSLT
另请注意身份转换的使用,以便可以复制其他节点而无需显式引用它们。当将此 XSLT 应用于您的输入时,将生成以下输出:
编辑:我已修改 XSLT 以删除不必要的模板匹配。
If you interested in how this is achieved using Muenchian Grouping, which is a common technique in XSLT, you first need to define a 'key' to identify duplicate books within a row.
In this I am achieving this using a concatenated key of RowID, BookType and BookName. The key will contain a list of books all with that particular value of key. Do note the use of the # character as the joining character. If there is any chance of # appearing in your XML, you will need to pick another character (or string).
Now when you are matching on book elements, you can check for duplicates like so
In other words, is this book element the first element in our key.
Here is the full XSLT
Also note the use of the identity transform so that other nodes can be copied without having to explicitly reference them. When this XSLT is applied to your input, the following output is generated:
EDIT: I have amended the XSLT to remove an unnecessary template match.