【问题标题】:remove duplicate nodes from xml file using xslt from bottom to top使用 xslt 从下到上从 xml 文件中删除重复节点
【发布时间】:2013-07-30 05:48:11
【问题描述】:

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

在以下示例中,项目“staticproperties”和 febrelease2013 具有两个变量“prop1”和“prop2”。但这些变量的最新值来自于 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>

【问题讨论】:

    标签: xml xslt duplicate-removal


    【解决方案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>
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多