2011-07-18 125 views
4

我有以下输入XML这需要使用XSLTXSLT:基于名称属性删除重复的节点

输入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,它将复制第1个“报警”节点。 –

2

这里是典型的身份规则 - 基于解决方案

<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> 

当所提供的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> 
     <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. 有一个模板覆盖身份规则。它匹配不是其父项的第一个子项的任何​​元素。这个模板没有主体 - 有效地丢弃任何这样的匹配元素被复制到输出中。

相关问题