Удалить дубликаты узлов из xml файла с помощью xslt снизу вверх

Мне нужно удалить дубликаты из файла XML снизу вверх, потому что я добавлю много проектов (элементов) в этот XML файл, и я не хочу, чтобы новое значение было перезаписано старым значением.

В следующем примере проекты "staticproperties" и febrelease2013 имеют две переменные "prop1" и "prop2". Но последние значения для этих переменных относятся к предложению febrelease2013.

Возможно ли всегда копировать узлы снизу вверх.

В следующем URL-адресе код работает нормально, но он справляется сверху вниз.

удалять повторяющиеся узлы из xml файла с помощью 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:apply-templates></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:call-template></xsl:if>
</xsl:template>

</xsl:key></xsl:stylesheet>

t:\ftemp>

Вместо того, чтобы идентифицировать узел первым из таблицы ключей, я определяю его как последний.

licensed under cc by-sa 3.0 with attribution.