帮助XSLT转换XML:分组和选择具有最大值的元素
我有当前的 XML:
<DocumentElement>
<Customer>
<CustomerId>2315</CustomerId>
<Date>2011-04-28 14:14:00</Date>
<VersionNumber>1</VersionNumber>
<GUID>2E05DE20-02A0-425D-944D-65E5E744FF8A</GUID>
</Customer>
<Customer>
<CustomerId>2316</CustomerId>
<Date>2011-04-28 15:03:00</Date>
<VersionNumber>2</VersionNumber>
<GUID>2E05DE20-02A0-425D-944D-65E5E744FF8A</GUID>
</Customer>
<Customer>
<CustomerId>2317</CustomerId>
<Date>2011-04-28 15:03:00</Date>
<VersionNumber>1</VersionNumber>
<GUID>9995DE20-02A0-425D-944D-65E5E744FF8A</GUID>
</Customer>
</DocumentElement>
我想做的是过滤掉每个 GUID 中具有最高版本号的一个元素,即,将上面的文档转换为如下所示:
<DocumentElement>
<Customer>
<CustomerId>2316</CustomerId>
<Date>2011-04-28 15:03:00</Date>
<VersionNumber>2</VersionNumber>
<GUID>2E05DE20-02A0-425D-944D-65E5E744FF8A</GUID>
</Customer>
<Customer>
<CustomerId>2317</CustomerId>
<Date>2011-04-28 15:03:00</Date>
<VersionNumber>1</VersionNumber>
<GUID>9995DE20-02A0-425D-944D-65E5E744FF8A</GUID>
</Customer>
</DocumentElement>
任何可以为我指明从哪里开始的正确方向的人?
提前致谢。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
作为练习,我尝试使用 XSLT 2.0 和 XPath 2.0 来解决此问题:
主要区别:
使用 XSLT 2.0,您不需要像 xsl:key ="https://stackoverflow.com/questions/5813962/help-with-xslt-to-transform-xml/5815805#5815805">这个其他答案,但您可以使用
xsl:for- every-group ... group-by="GUID"
使用 XPath 2.0,您拥有
fn:max(...)
函数As an exercise, I've tried to solve this using XSLT 2.0 and XPath 2.0:
Major differences:
with XSLT 2.0 you don't need to define an
xsl:key
as in this other answer, but you can usexsl:for-each-group ... group-by="GUID"
with XPath 2.0 you have the
fn:max(...)
function我首先在 GUID 上声明 key,这使得能够轻松处理不同的 GUID;然后,根据 GUID,根据 VersionNumber 对相应的 Customer 元素进行排序,并简单地复制第一个 (xslt-1.0):
使用节点集的交集是处理每个不同 GUID 的第一个 Customer 的另一种方法:
I would start with declaring a key on GUID, this enables to easily process distinct GUIDs; then, per GUID, sort the corresponding Customer elements on their VersionNumber and simply copy the first (xslt-1.0):
Using this intersection of nodesets is another way to process the first Customer for each distinct GUID: