2011-07-18 31 views
4

私は、XSLTXSLT:name属性に基づいて重複ノードを削除

入力XMLに変換する必要が以下の入力XMLがあります

<result> 
    <circuit>MX123456</circuit> 
    <psaresult> 
     <Live_Alarms> 
      <diagnosis> 
       <utr>xxx</utr> 
       <dtr>xxx</dtr> 
       <text /> 
       <site>xxx</site> 
       <address /> 
       <tech_type /> 
       <end /> 
       <network_type>xxx</network_type> 
      </diagnosis> 
      <Alarms> 
       <alarmId>463</alarmId> 
       <cct>xxx</cct> 
       <eventTime>12/05/11 09:21:21</eventTime> 
       <clearTime /> 
       <problemCode>xxxx</problemCode> 
       <problemText>xxxx</problemText> 
       <equipmentName>xxx</equipmentName> 
       <unit>xxx</unit> 
       <rcKey>xxx</rcKey> 
       <category>xxx</category> 
       <rootCause>xxxx</rootCause> 
      </Alarms> 
      <Alarms> 
       <alarmId>464</alarmId> 
       <cct>xxx</cct> 
       <eventTime>12/05/11 09:21:22</eventTime> 
       <clearTime /> 
       <problemCode>yyyy</problemCode> 
       <problemText>yyyy</problemText> 
       <equipmentName>yyyy</equipmentName> 
       <unit>yyyy</unit> 
       <rcKey>yyyy</rcKey> 
       <category>yyyy</category> 
       <rootCause>yyyy</rootCause> 
      </Alarms> 
     </Live_Alarms> 
    </psaresult> 
</result> 

予想される出力:

<result> 
    <circuit>MX123456</circuit> 
    <psaresult> 
     <Live_Alarms> 
      <psadiagnosis> 
       <utr>xxx</utr> 
       <dtr>xxx</dtr> 
       <text /> 
       <site>xxx</site> 
       <address /> 
       <tech_type /> 
       <end /> 
       <network_type>xxx</network_type> 
      </psadiagnosis> 
      <Alarms> 
       <alarmId>463</alarmId> 
       <cct>xxx</cct> 
       <eventTime>12/05/11 09:21:21</eventTime> 
       <clearTime /> 
       <problemCode>xxxx</problemCode> 
       <problemText>xxxx</problemText> 
       <equipmentName>xxx</equipmentName> 
       <unit>xxx</unit> 
       <rcKey>xxx</rcKey> 
       <category>xxx</category> 
       <rootCause>xxxx</rootCause> 
      </Alarms> 
     </Live_Alarms> 
    </psaresult> 
</result> 

:ONY最初​​ノードはSelectSinglenodeが何をするかのように必要に応じて、他のすべては、FRを切り捨てする必要があります出力をオフにします。これがxsltからどのように達成できるのかアドバイスできますか?

+0

良い質問、1。最も基本的で強力なXSLTデザインパターン(アイデンティティルールのオーバーライド)に基づいた完全で簡潔なソリューションについては、私の答えをご覧ください。 –

+0

説明とリンクも用意されています。 –

答えて

0

使用この:

<?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:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()[not(self::Alarms)] | Alarms[1]"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

出力XML:

<?xml version="1.0" encoding="utf-8"?> 
<result> 
    <circuit>MX123456</circuit> 
    <psaresult> 
     <Live_Alarms> 
      <diagnosis> 
       <utr>xxx</utr> 
       <dtr>xxx</dtr> 
       <text /> 
       <site>xxx</site> 
       <address /> 
       <tech_type /> 
       <end /> 
       <network_type>xxx</network_type> 
      </diagnosis> 
      <Alarms> 
       <alarmId>463</alarmId> 
       <cct>xxx</cct> 
       <eventTime>12/05/11 09:21:21</eventTime> 
       <clearTime /> 
       <problemCode>xxxx</problemCode> 
       <problemText>xxxx</problemText> 
       <equipmentName>xxx</equipmentName> 
       <unit>xxx</unit> 
       <rcKey>xxx</rcKey> 
       <category>xxx</category> 
       <rootCause>xxxx</rootCause> 
      </Alarms> 


     </Live_Alarms> 
    </psaresult> 

</result> 
+0

私はこれを使って、を使っていました。ありがとう。私はこれを変更する必要があるかどうかこの他のコメント? – Jaisal

+0

@Jaisal、それは最初の 'Alarms'ノードをコピーします。 –

2

ここでは、標準的なアイデンティティルールです - ベースのソリューション:提供XMLに適用した場合

<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="Alarms[position() >1]"/> 
</xsl:stylesheet> 

文書:正確に所望の、正しい結果がを生成さ

<result> 
    <circuit>MX123456</circuit> 
    <psaresult> 
     <Live_Alarms> 
      <diagnosis> 
       <utr>xxx</utr> 
       <dtr>xxx</dtr> 
       <text /> 
       <site>xxx</site> 
       <address /> 
       <tech_type /> 
       <end /> 
       <network_type>xxx</network_type> 
      </diagnosis> 
      <Alarms> 
       <alarmId>463</alarmId> 
       <cct>xxx</cct> 
       <eventTime>12/05/11 09:21:21</eventTime> 
       <clearTime /> 
       <problemCode>xxxx</problemCode> 
       <problemText>xxxx</problemText> 
       <equipmentName>xxx</equipmentName> 
       <unit>xxx</unit> 
       <rcKey>xxx</rcKey> 
       <category>xxx</category> 
       <rootCause>xxxx</rootCause> 
      </Alarms> 
      <Alarms> 
       <alarmId>464</alarmId> 
       <cct>xxx</cct> 
       <eventTime>12/05/11 09:21:22</eventTime> 
       <clearTime /> 
       <problemCode>yyyy</problemCode> 
       <problemText>yyyy</problemText> 
       <equipmentName>yyyy</equipmentName> 
       <unit>yyyy</unit> 
       <rcKey>yyyy</rcKey> 
       <category>yyyy</category> 
       <rootCause>yyyy</rootCause> 
      </Alarms> 
     </Live_Alarms> 
    </psaresult> 
</result> 

<result> 
    <circuit>MX123456</circuit> 
    <psaresult> 
     <Live_Alarms> 
     <diagnosis> 
      <utr>xxx</utr> 
      <dtr>xxx</dtr> 
      <text/> 
      <site>xxx</site> 
      <address/> 
      <tech_type/> 
      <end/> 
      <network_type>xxx</network_type> 
     </diagnosis> 
     <Alarms> 
      <alarmId>463</alarmId> 
      <cct>xxx</cct> 
      <eventTime>12/05/11 09:21:21</eventTime> 
      <clearTime/> 
      <problemCode>xxxx</problemCode> 
      <problemText>xxxx</problemText> 
      <equipmentName>xxx</equipmentName> 
      <unit>xxx</unit> 
      <rcKey>xxx</rcKey> 
      <category>xxx</category> 
      <rootCause>xxxx</rootCause> 
     </Alarms> 
     </Live_Alarms> 
    </psaresult> 
</result> 

説明

  1. identity rule(テンプレート)のコピー各ノード「として、あります"

  2. 同一性テンプレートを上書きするテンプレートが1つあります。これは、親の最初の​​子ではない​​要素に一致します。このテンプレートにはボディはありません。このような要素が出力にコピーされるのを効果的に破棄します。

関連する問題