こんにちは、次のXMLの2つの連続した項目を比較しようとしています。XSLTを使用して連続する2行のXMLを比較する
EmployeeID|CountryCode|RegionCode|StartDate
"111111"|"US"|"RX"|"2014-07-01"
"111111"|"US"|"MD"|"2009-10-14"
"111111"|"US"|"MD"|"2009-09-14"
"111111"|"US"|"RX"|"2013-07-01""
しかし、私は期待しています::
<wd:Report_Data xmlns:wd="urn:com.workday.report/Test">
<wd:Report_Entry>
<wd:Location_Changes>
<wd:EmployeeID>111111</wd:EmployeeID>
<wd:CountryCode>US</wd:CountryCode>
<wd:RegionCode>RX</wd:RegionCode>
<wd:StartDate>2013-07-01</wd:StartDate>
</wd:Location_Changes>
<wd:Location_Changes>
<wd:EmployeeID>111111</wd:EmployeeID>
<wd:CountryCode>US</wd:CountryCode>
<wd:RegionCode>MD</wd:RegionCode>
<wd:StartDate>2009-09-14</wd:StartDate>
</wd:Location_Changes>
<wd:Location_Changes>
<wd:EmployeeID>111111</wd:EmployeeID>
<wd:CountryCode>US</wd:CountryCode>
<wd:RegionCode>MD</wd:RegionCode>
<wd:StartDate>2009-10-14</wd:StartDate>
</wd:Location_Changes>
<wd:Location_Changes>
<wd:EmployeeID>111111</wd:EmployeeID>
<wd:CountryCode>US</wd:CountryCode>
<wd:RegionCode>RX</wd:RegionCode>
<wd:StartDate>2014-07-01</wd:StartDate>
</wd:Location_Changes>
</wd:Report_Entry>
</wd:Report_Data>
出力がある
EmployeeID|CountryCode|RegionCode|StartDate
"111111"|"US"|"RX"|"2014-07-01"
"111111"|"US"|"MD"|"2009-10-14"
"111111"|"US"|"RX"|"2013-07-01"
ための同じ組み合わせを持つ別の連続したエントリがある場合は、 "社員| RegionCode"、そのエントリがすべき含まれない。 私は主キーを使用して重複したエントリがないことを確認しました。
私は、次のXSLTを使用しています:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:wd="urn:com.workday.report/Test"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output method="text"
omit-xml-declaration="yes"/>
<!-- Variables to hold fillers - pipe, new line, double quotes -->
<xsl:variable name="delimiter"
select="'|'"/>
<xsl:variable name="linefeed"
select="'
'"/>
<xsl:variable name="dQuote">"</xsl:variable>
<xsl:variable name="duplicate_key"
match="wd:Report_Data/wd:Report_Entry/wd:Location_Changes"
select="concat(wd:EmployeeID,'|',wd:RegionCode)" />
<!--To remove duplicates-->
<xsl:key name="primary_key"
match="wd:Report_Data/wd:Report_Entry/wd:Location_Changes"
use="concat(wd:EmployeeID,'|',wd:RegionCode,'|',wd:StartDate)" />
<xsl:template match="/">
<!-- Header Row Begin -->
<xsl:text>EmployeeID</xsl:text>
<xsl:value-of select="$delimiter"/>
<xsl:text>CountryCode</xsl:text>
<xsl:value-of select="$delimiter"/>
<xsl:text>RegionCode</xsl:text>
<xsl:value-of select="$delimiter"/>
<xsl:text>StartDate</xsl:text>
<xsl:value-of select="$linefeed"/>
<!-- Header Row End -->
<!-- Data Row Starts -->
<!-- Parse each and every employee record -->
<!--To Reverse the Records and Remove duplicates-->
<xsl:for-each select="wd:Report_Data/wd:Report_Entry/wd:Location_Changes[generate-id()= generate-id(key('primary_key',concat(wd:EmployeeID,'|',wd:RegionCode,'|',wd:StartDate))[1])]">
<xsl:sort select="position()"
data-type="number"
order="descending"/>
<xsl:call-template name="output">
<xsl:with-param name="unique_code"/>
</xsl:call-template>
</xsl:for-each>
</xsl:template>
<xsl:template name="output">
<xsl:param name="unique_code"/>
<!-- Data Row Begins -->
<xsl:if test="$duplicate_key != concat(wd:EmployeeID,'|',wd:RegionCode)">
<!-- #1 EmployeeID -->
<xsl:value-of select="$dQuote"/>
<xsl:value-of select="wd:EmployeeID"/>
<xsl:value-of select="$dQuote"/>
<xsl:value-of select="$delimiter"/>
<!-- #2 CountryCode -->
<xsl:value-of select="$dQuote"/>
<xsl:value-of select="wd:CountryCode"/>
<xsl:value-of select="$dQuote"/>
<xsl:value-of select="$delimiter"/>
<!-- #3 RegionCode-->
<xsl:value-of select="$dQuote"/>
<xsl:value-of select="wd:RegionCode"/>
<xsl:value-of select="$dQuote"/>
<xsl:value-of select="$delimiter"/>
<!-- #4 StartDate-->
<xsl:value-of select="$dQuote"/>
<xsl:value-of select="wd:StartDate"/>
<xsl:value-of select="$dQuote"/>
<xsl:value-of select="$linefeed"/>
</xsl:if>
<!-- To Remove Consecutive Duplicates-->
<xsl:variable name="duplicate_key"?
match="wd:Report_Data/wd:Report_Entry/wd:Location_Changes"
select="concat(wd:EmployeeID,'|',wd:RegionCode)" />
<!-- Data Row End -->
</xsl:template>
</xsl:stylesheet>
ここでの問題 「社員のための同じ組み合わせを持つ別の連続したエントリがある場合、私は
** 1 **「連続」部分の重要度はどれくらいですか?隣接していない重複を保持しますか? ** 2。** "EmployeeID | RegionCode" * "の" *同じ組み合わせ "として重複を定義する場合、なぜテストにStartDateを含めるのですか? ** 3。** XSLT 2.0を使用している場合は、XSLT 2.0のネイティブなグループ化方法を使用してください。 –
1.連続部分は本当に重要です。連続する重複のみを削除する必要があり、隣接する重複を保持する必要があります。 2.同じEmployeeID | RegionCodeがいくつかの異なるエントリの後に出現する可能性があるので、StartDateがキーに必要です。 3.注文は同じである必要があります。それを変更することはできません。 –
あなたは一つのことを言っており、あなたの期待される出力は別のことを言います。 –