gpt4 book ai didi

xml - 需要 XSLT 转换以删除重复元素 - 按属性排序

转载 作者:数据小太阳 更新时间:2023-10-29 01:49:38 25 4
gpt4 key购买 nike

我有一段糟糕的 XML 需要通过 BizTalk 处理,我已经设法将其规范化为下面的示例。我不是 XSLT 专家,但在 Web 和 VS2010 调试器之间,我可以找到自己的 XSL 方法。

我现在需要一点聪明的 XSLT 来“剔除”重复的元素并只保留最新的元素,这由 ValidFromDate 属性中的日期决定。

ValidFromDate 属性是 XSD:Date 类型。

<SomeData>
<A ValidFromDate="2011-12-01">A_1</A>
<A ValidFromDate="2012-01-19">A_2</A>
<B CalidFromDate="2011-12-03">B_1</B>
<B ValidFromDate="2012-01-17">B_2</B>
<B ValidFromDate="2012-01-19">B_3</B>
<C ValidFromDate="2012-01-20">C_1</C>
<C ValidFromDate="2011-01-20">C_2</C>
</SomeData>

转换后我只想保留这些行:

<SomeData>
<A ValidFromDate="2012-01-19">A_2</A>
<B ValidFromDate="2012-01-19">B_3</B>
<C ValidFromDate="2012-01-20">C_1</C>
</SomeData>

关于我如何将 XSL 放在一起的任何线索?我已经清空了 Internet 以寻找解决方案,并且尝试了很多聪明的 XSL 排序脚本,但我觉得没有一个让我走上了正确的方向。

最佳答案

Xslt 1.0 中此问题的最佳解决方案是使用 Muenchian 分组。 (假定元素已按 ValidFromDate 属性排序)以下样式表应该可以解决问题:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

<xsl:key name="element-key" match="/SomeData/*" use="name()" />

<xsl:template match="/SomeData">
<xsl:copy>
<xsl:for-each select="*[generate-id() = generate-id(key('element-key', name()))]">
<xsl:copy-of select="(. | following-sibling::*[name() = name(current())])[last()]" />
</xsl:for-each>
</xsl:copy>
</xsl:template>

</xsl:stylesheet>

这是我针对您的示例 Xml 运行它时得到的结果:

<?xml version="1.0" encoding="utf-8"?>
<SomeData>
<A ValidFromDate="2012-01-19">A_2</A>
<B ValidFromDate="2012-01-19">B_3</B>
<C ValidFromDate="2011-01-20">C_2</C>
</SomeData>

关于xml - 需要 XSLT 转换以删除重复元素 - 按属性排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9022980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com