0

我需要从下到上从 XML 文件中删除重复项,因为我将向这个 XML 文件添加很多项目(元素),并且我不希望新值被旧值覆盖。

在以下示例中,项目“staticproperties”和 febrelease2013 具有两个变量“prop1”和“prop2”。但这些变量的最新值来自项目 febrelease2013。

是否可以始终从下到上复制节点。

在以下 url 中,代码工作正常,但它是从上到下处理的。

使用 xsl 从 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>

预期输出为:

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

1 回答 1

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>

我没有将节点标识为密钥表中的第一个,而是将其标识为最后一个。

于 2013-07-29T21:48:11.637 回答