<p>考虑一下<a href="https://www.w3.org/Style/XSL/" rel="nofollow noreferrer">XSLT</a>,这是一种专门用来转换XML的语言,例如保留具有重复属性的节点。Python的第三方模块<code>lxml</code>,可以运行xslt1.0脚本。另一个好处是XSLT可以移植到其他语言/软件中,而且不需要Python来运行它!在</p>
<p>具体来说,下面使用<a href="http://www.jenitennison.com/xslt/grouping/muenchian.html" rel="nofollow noreferrer">Muenchenian Grouping</a>为每个不同的<em>@id_user</em>使用<code>xsl:key</code>索引文档。然后模板匹配只检索计数大于1的那些。在</p>
<p><strong>XSLT</strong><em>(另存为.xsl文件,一个特殊的.xml文件)</em></p>
<pre><code><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="idkey" match="facturic" use="@id_user" />
<xsl:template match="/ROOT">
<xsl:copy>
<xsl:apply-templates select="facturic"/>
</xsl:copy>
</xsl:template>
<xsl:template match="facturic[count(key('idkey', @id_user)) > 1]">
<xsl:copy>
<xsl:copy-of select="*|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
</code></pre>
<p>Python</strong><em>(无<code>for</code>循环或<code>if</code>逻辑)</em></p>
^{pr2}$
<p><strong>输出</strong></p>
<pre><code><?xml version="1.0"?>
<ROOT>
<facturic id_user="18446195">
<artfacturic/>
</facturic>
<facturic id_user="18446195">
<artfacturic/>
</facturic>
</ROOT>
</code></pre>