2013-07-29 1 views
0

아래 XML 파일에서 중복을 제거해야합니다.이 XML 파일에 많은 프로젝트 (요소)를 추가 할 것이므로 새 값을 이전 값으로 겹쳐 쓰게하십시오.아래에서 위로 xslt를 사용하여 xml 파일에서 중복 노드를 제거하십시오.

다음 예제에서는 "prop1"과 "prop2"라는 두 개의 변수가있는 "staticproperties"및 febrelease2013을 프로젝트에 표시합니다. 그러나이 변수의 최신 값은 propject febrelease2013에서 나온 값입니다.

항상 아래에서 위로 노드를 복사 할 수 있습니까?

다음 URL에서 코드는 정상적으로 작동하지만 위쪽에서 아래쪽으로 처리 중입니다.

remove duplicate nodes from xml file using xsl

예 :

<?xml version="1.0" encoding="utf-8" standalone="no"?> 
<projects> 
     <project id="staticproperties"> 
      <property name="prop1">old-value</property>  
      <property name="prop2">abc</property>    
      <property name="prop3">old-value</property>  
      <property name="prop4">def</property> 
      </project> 
     <project id="febrelease2013"> 
      <property name="prop">abcd123</property> 
      <property name="prop1">new-value</property> 
      <property name="prop3">new-value</property>     
      <property name="prop5">defg</property> 
     </project> 
</projects> 

예상 출력은 다음과 같습니다

<?xml version="1.0" encoding="utf-8" standalone="no"?> 
<projects> 
     <project id="staticproperties">    
      <property name="prop2">abc</property>  
      <property name="prop4">def</property>  
      </project> 
     <project id="febrelease2013"> 
      <property name="prop">abcd123</property> 
      <property name="prop1">new-value</property> 
      <property name="prop3">new-value</property>     
      <property name="prop5">defg</property>  
     </project> 
</projects> 

답변

1

다음은 트릭을해야 다음

t:\ftemp>type projects.xml 
<?xml version="1.0" encoding="utf-8" standalone="no"?> 
<projects> 
     <project id="staticproperties"> 
      <property name="prop1">old-value</property> 
      <property name="prop2">abc</property> 
      <property name="prop3">old-value</property> 
      <property name="prop4">def</property> 
      </project> 
     <project id="febrelease2013"> 
      <property name="prop">abcd123</property> 
      <property name="prop1">new-value</property> 
      <property name="prop3">new-value</property> 
      <property name="prop5">defg</property> 
     </project> 
</projects> 
t:\ftemp>xslt projects.xml projects2.xsl 
<?xml version="1.0" encoding="utf-8"?><projects> 
     <project id="staticproperties"> 

      <property name="prop2">abc</property> 

      <property name="prop4">def</property> 
      </project> 
     <project id="febrelease2013"> 
      <property name="prop">abcd123</property> 
      <property name="prop1">new-value</property> 
      <property name="prop3">new-value</property> 
      <property name="prop5">defg</property> 
     </project> 
</projects> 
t:\ftemp>type projects2.xsl 
<?xml version="1.0" encoding="US-ASCII"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       version="1.0"> 

<xsl:template match="@*|node()" name="copy-this"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:key name="properties" match="property" use="@name"/> 

<xsl:template match="property"> 
<xsl:if test="generate-id(.)=generate-id(key('properties',@name)[last()])"> 
    <xsl:call-template name="copy-this"/> 
</xsl:if> 
</xsl:template> 

</xsl:stylesheet> 

t:\ftemp> 

를 대신 식별 노드가 키 테이블의 첫 번째 노드가 될 것입니다. 마지막으로 식별합니다.

+0

이것은 gr8, 감사합니다. – phani