2014-11-11 3 views
1
<?xml version="1.0" encoding="utf-8"?> 
<Employee_Data> 
    <Employee> 
     <NEW_HIRE_OR_REHIRE /> 
     <RETIREMENT_BENEFITS /> 
     <ADDRESS /> 
     <PERSONAL> 
      <Record> 
       <SSN>327408678</SSN> 
       <WDEmpID>10032417</WDEmpID> 
       <Initiator /> 
       <Effective>20141014</Effective> 
       <SeqNum>320</SeqNum> 
       <Last_Name>VAN TREECK</Last_Name> 
       <First_Name>DENISE</First_Name> 
       <Middle_Name>J</Middle_Name> 
       <Social_Suffix /> 
       <Birth_Date>19560422</Birth_Date> 
       <Gender>F</Gender> 
       <Ethnicity>0</Ethnicity> 
       <Marital_Status_Date>19781202</Marital_Status_Date> 
       <Marital_Status>M</Marital_Status> 
       <CITIZENSHIP /> 
       <Military_Service_Status /> 
       <Disability /> 
       <Indicator>PersonalRecordChangesIndicator</Indicator> 
      </Record> 
     </PERSONAL> 
     <STATUS /> 
     <POSITION> 
      <Record> 
       <SSN>327408678</SSN> 
       <WDEmpID>10032417</WDEmpID> 
       <Initiator /> 
       <Effective>20141006</Effective> 
       <SeqNum>250</SeqNum> 
       <ActionCode /> 
       <DEFAULTJOBCODE>YYY01</DEFAULTJOBCODE> 
       <SAPJOBCODE>30000715</SAPJOBCODE> 
       <PayEntity>NC1</PayEntity> 
       <DIVISION>CORP</DIVISION> 
       <ORGANIZATION>GES</ORGANIZATION> 
       <COMPANYNUMBER>01</COMPANYNUMBER> 
       <LEDGERDEPARTMENT>CHEN050D</LEDGERDEPARTMENT> 
       <SALARY_GRADE>LC008</SALARY_GRADE> 
       <TEMPORARY_POSITION_INDICATOR_FOR_POSITION_RECORD /> 
       <LocationCode>AP10</LocationCode> 
       <LocationDepartment>050D</LocationDepartment> 
       <WDEmpID>10032417</WDEmpID> 
       <Indicator>Position and Location Change Indicator</Indicator> 
      </Record> 
      <Record> 
       <SSN>327408678</SSN> 
       <WDEmpID>10032417</WDEmpID> 
       <Initiator /> 
       <Effective>20141006</Effective> 
       <SeqNum>250</SeqNum> 
       <ActionCode /> 
       <DEFAULTJOBCODE>YYY01</DEFAULTJOBCODE> 
       <SAPJOBCODE>30000715</SAPJOBCODE> 
       <PayEntity>NC1</PayEntity> 
       <DIVISION>CORP</DIVISION> 
       <ORGANIZATION>GES</ORGANIZATION> 
       <COMPANYNUMBER>01</COMPANYNUMBER> 
       <LEDGERDEPARTMENT>CHEN050D</LEDGERDEPARTMENT> 
       <SALARY_GRADE>LC008</SALARY_GRADE> 
       <TEMPORARY_POSITION_INDICATOR_FOR_POSITION_RECORD /> 
       <LocationCode>AP10</LocationCode> 
       <LocationDepartment>050D</LocationDepartment> 
       <WDEmpID>10032417</WDEmpID> 
       <Indicator>Position and Location Department change Indicator 
       </Indicator> 
      </Record> 
     </POSITION> 
     <COMPENSATION /> 
     <SALES_TERRITORY /> 
     <TERMINATION /> 
    </Employee> 
</Employee_Data> 

Это xml генерируемый 1 xslt. Я в основном хочу проверить, совпадают ли 2 записи на вкладке «Позиция», а затем сохранить только один из них. В этом случае выход должен быть таким, как указано ниже.Удаление повторяющихся записей из xml

<?xml version="1.0" encoding="utf-8"?> 
<Employee_Data> 
    <Employee> 
     <NEW_HIRE_OR_REHIRE /> 
     <RETIREMENT_BENEFITS /> 
     <ADDRESS /> 
     <PERSONAL> 
      <Record> 
       <SSN>327408678</SSN> 
       <WDEmpID>10032417</WDEmpID> 
       <Initiator /> 
       <Effective>20141014</Effective> 
       <SeqNum>320</SeqNum> 
       <Last_Name>VAN TREECK</Last_Name> 
       <First_Name>DENISE</First_Name> 
       <Middle_Name>J</Middle_Name> 
       <Social_Suffix /> 
       <Birth_Date>19560422</Birth_Date> 
       <Gender>F</Gender> 
       <Ethnicity>0</Ethnicity> 
       <Marital_Status_Date>19781202</Marital_Status_Date> 
       <Marital_Status>M</Marital_Status> 
       <CITIZENSHIP /> 
       <Military_Service_Status /> 
       <Disability /> 
       <Indicator>PersonalRecordChangesIndicator</Indicator> 
      </Record> 
     </PERSONAL> 
     <STATUS /> 
     <POSITION> 
      <Record> 
       <SSN>327408678</SSN> 
       <WDEmpID>10032417</WDEmpID> 
       <Initiator /> 
       <Effective>20141006</Effective> 
       <SeqNum>250</SeqNum> 
       <ActionCode /> 
       <DEFAULTJOBCODE>YYY01</DEFAULTJOBCODE> 
       <SAPJOBCODE>30000715</SAPJOBCODE> 
       <PayEntity>NC1</PayEntity> 
       <DIVISION>CORP</DIVISION> 
       <ORGANIZATION>GES</ORGANIZATION> 
       <COMPANYNUMBER>01</COMPANYNUMBER> 
       <LEDGERDEPARTMENT>CHEN050D</LEDGERDEPARTMENT> 
       <SALARY_GRADE>LC008</SALARY_GRADE> 
       <TEMPORARY_POSITION_INDICATOR_FOR_POSITION_RECORD /> 
       <LocationCode>AP10</LocationCode> 
       <LocationDepartment>050D</LocationDepartment> 
       <WDEmpID>10032417</WDEmpID> 
       <Indicator>Position and Location Change Indicator</Indicator> 
      </Record> 
      </POSITION> 
     <COMPENSATION /> 
     <SALES_TERRITORY /> 
     <TERMINATION /> 
    </Employee> 
</Employee_Data> 
+0

возможно дубликат [XSLT: найти дубликаты в пределах каждого ребенка] (http://stackoverflow.com/questions/16909500/xslt-find-duplicates-within-each-child) – FiveO

+0

<- скопировать корневой элемент -> : Наносить-шаблоны выберите =» Employee [ПОЛОЖЕНИЕ [ нет (POSITION/Запись = ведомая-родственный :: Rec ога) ]] "/> <- скопировать элемент на выходе ->

ответ

0

Чтобы удалить повторяющиеся записи, вы можете использовать Muenchian Группировку:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="no" indent="yes"/> 
<xsl:strip-space elements="*"/> 
    <xsl:key name="seqNumByRecord" match="Record" use="SeqNum"/> 
    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 
    <xsl:template match= 
    "Record[not(generate-id() = generate-id(key('seqNumByRecord', SeqNum)[1]))]" 
    /> 
</xsl:stylesheet> 

Первый шаблоном является identity transform, который соответствует всем атрибутам и узлы и копируют их. Второй шаблон - пустой шаблон, который соответствует всем дубликатам. Поскольку шаблон пуст, эти записи будут удалены. Для подробного объяснения Muenchian Группировка этой статьи Jeni Tennison рекомендуется: http://www.jenitennison.com/xslt/grouping/muenchian.html, и вы также найдете много отличных ответов на Stackoverflow.

Для разнообразия, второе решение:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 
    <xsl:template match="Record[SeqNum = following::Record/SeqNum]"/> 
</xsl:stylesheet> 

При таком подходе пустой шаблон для удаления дубликатов соответствует всем записям, которые имеют один и тот же SeqNum в следующих отчетах. Как вы найдете в упомянутой статье, метод Muenchian считается более эффективным.

Смежные вопросы