【发布时间】:2012-06-20 20:21:23
【问题描述】:
我对 XML 和 XLST 完全陌生。我有一份以 XML 格式输出的报告。它有几千条记录,但它是相同的两行数据,一遍又一遍地重复。我需要一种方法将输出 XML 文件限制为只有那两个唯一的数据行。
以下是我的 XML 文件当前的示例:
<zd:Report_Data xmlns:zd="urn:com.xxxx.report/xxxx-Employee_Status-Outbound">
<zd:Report_Entry>
<zd:empStat.emplStatusCode>A</zd:empStat.emplStatusCode>
<zd:empStat.name>Active Employee</zd:empStat.name>
<zd:worker>
<zd:empStat.lastUpdateDate>1/1/1968</zd:empStat.lastUpdateDate>
<zd:empStat.actvInd>1</zd:empStat.actvInd>
</zd:worker>
</zd:Report_Entry>
<zd:Report_Entry>
<zd:empStat.emplStatusCode>A</zd:empStat.emplStatusCode>
<zd:empStat.name>Active Employee</zd:empStat.name>
<zd:worker>
<zd:empStat.lastUpdateDate>1/1/1968</zd:empStat.lastUpdateDate>
<zd:empStat.actvInd>1</zd:empStat.actvInd>
</zd:worker>
</zd:Report_Entry>
<zd:Report_Entry>
<zd:empStat.emplStatusCode>A</zd:empStat.emplStatusCode>
<zd:empStat.name>Active Employee</zd:empStat.name>
<zd:worker>
<zd:empStat.lastUpdateDate>1/1/1968</zd:empStat.lastUpdateDate>
<zd:empStat.actvInd>0</zd:empStat.actvInd>
</zd:worker>
</zd:Report_Entry>
<zd:Report_Entry>
<zd:empStat.emplStatusCode>A</zd:empStat.emplStatusCode>
<zd:empStat.name>Active Employee</zd:empStat.name>
<zd:worker>
<zd:empStat.lastUpdateDate>1/1/1968</zd:empStat.lastUpdateDate>
<zd:empStat.actvInd>0</zd:empStat.actvInd>
</zd:worker>
</zd:Report_Entry>
</zd:Report_Data>
这是我想要的样子:
<zd:Report_Data xmlns:zd="urn:com.xxxx.report/xxxx-Employee_Status-Outbound">
<zd:Report_Entry>
<zd:empStat.emplStatusCode>A</zd:empStat.emplStatusCode>
<zd:empStat.name>Active Employee</zd:empStat.name>
<zd:worker>
<zd:empStat.lastUpdateDate>1/1/1968</zd:empStat.lastUpdateDate>
<zd:empStat.actvInd>1</zd:empStat.actvInd>
</zd:worker>
</zd:Report_Entry>
<zd:Report_Entry>
<zd:empStat.emplStatusCode>A</zd:empStat.emplStatusCode>
<zd:empStat.name>Active Employee</zd:empStat.name>
<zd:worker>
<zd:empStat.lastUpdateDate>1/1/1968</zd:empStat.lastUpdateDate>
<zd:empStat.actvInd>0</zd:empStat.actvInd>
</zd:worker>
</zd:Report_Entry>
</zd:Report_Data>
^^更新
我看到了一些我认为可以在这个网站 (http://stackoverflow.com/questions/3016929/selecting-unique-records-in-xslt-xpath) 上工作的东西,但我无法将它应用到我的情况。任何帮助将不胜感激!
这是我目前根据我在这里阅读的另一篇文章得出的结论。不幸的是,它没有返回任何数据:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key name="kItemBy3Children" match="Report_Entry"
use="concat(empStat.emplStatusCode, '+', empStat.name, '+', empStat.lastUpdateDate, '+', empStat.actvInd)"/>
<xsl:template match="/">
<xsl:copy-of select=
"*/item[generate-id()
= generate-id(key('kItemBy4Children',
concat(empStat.emplStatusCode,
'+', empStat.name,
'+', empStat.lastUpdateDate,
'+', empStat.actvInd)
)
)
]
"/>
</xsl:template>
</xsl:stylesheet>
【问题讨论】:
-
你走了多远?您有任何(尚未完全正确的)代码要显示吗?你到底有什么问题?您对问题的描述越准确,我们就越能向您解释:-)
-
您好,感谢您的回复。我添加到我的原始帖子中是为了向您展示我到目前为止所做的尝试。
-
@micheal Kay..不幸的是,这不是我的问题。问题是有数千条记录,但它们始终是相同的两条,它们不一定按顺序排列。在第二个出现之前,第一个数据集可能会显示 100 倍。
-
@O.R.映射器...谢谢。让我玩一会儿。我试图转储到 xslt 并没有失败。但是,它也没有过滤掉重复项。它返回了报告中的所有数据,而不是我正在寻找的 2 条唯一记录。我确定这是我的错误。我对此完全陌生,因此很难解决我自己的问题。再次感谢您的帮助和耐心。
-
我已经更新了我的答案,因此它包含一个删除重复项的测试用例。我假设您可能遇到命名空间不匹配的问题,因此在您尝试时只执行了身份模板。