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

标签 xml xslt xpath biztalk

我有一段糟糕的 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/

相关文章:

php - 在 Localhost XML 正在生成,但在服务器中它正在创建 Empty Xml

xslt - 为什么 XPath 中的索引从 1 而不是 0 开始?

java - Selenium - 如何获取元素及其子元素文本

java - 在基于 php 的应用程序中嵌入 DITA Open Toolkit

xml - 使用 XPath starts-with 或 contains 函数来搜索 Windows 事件日志

java - 单个 XSLT 文件能否解决这个问题 - 继续..?

javascript - 从 JavaScript 获取创建 HTML 的 XSL 元素

xml - xsl :param namespace error (may not be used in namespace)

XSLT 如何在元素说到时修剪元素前后的空间?

xml - 将 excel 导出到带有空白单元格的 xml 电子表格