0

XML ファイルから重複を下から上に削除する必要があります。これは、この XML ファイルに多くのプロジェクト (要素) を追加し、新しい値を古い値で上書きしたくないためです。

次の例では、プロジェクト "staticproperties" と febrelease2013 に 2 つの変数 "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 に答える