我需要抑制XML文件中的所有重复值并保留最终值(请参阅目标文件)。
请帮助,因为我不知道是否应该使用xslt,python或任何.NET API
这是源文件:
<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
<cd>
<artist>Bob Dylan</artist>
</cd>
<cd>
<title>Hide your heart</title>
</cd>
<cd>
<title>old_value</title>
<title>inbetween_value</title>
<title>new_value</title>
</cd>
</catalog>
预期的目标文件:
<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
<cd>
<artist>Bob Dylan</artist>
</cd>
<cd>
<title>Hide your heart</title>
</cd>
<cd>
<title>new_value</title>
</cd>
</catalog>
答案 0 :(得分:1)
XSLT 1版本:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="*">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="cd/*">
<xsl:if test="not(following-sibling::*[name()=name(current())])">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:1)
有一个非常简单的(没有明确的条件,没有轴)XSLT解决方案:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output encoding="ISO-8859-1"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="cd/title[not(position() = last())]"/>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<catalog>
<cd>
<artist>Bob Dylan</artist>
</cd>
<cd>
<title>Hide your heart</title>
</cd>
<cd>
<title>old_value</title>
<title>inbetween_value</title>
<title>new_value</title>
</cd>
</catalog>
产生了想要的正确结果:
<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
<cd>
<artist>Bob Dylan</artist>
</cd>
<cd>
<title>Hide your heart</title>
</cd>
<cd>
<title>new_value</title>
</cd>
</catalog>
答案 2 :(得分:0)
您可以使用您想要的任何技术。如果您的要求是“对于每个cd
元素,请仅保留重复子元素名称的最后一个值”,这是一个LINQ to XML解决方案,假设您有一个名为XDocument
的{{1}}:< / p>
oldDoc
答案 3 :(得分:0)
要删除所有重复项,您可以在标记名称和元素之间保留一个dict。在Python中使用minidom:
xml = """<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
<cd>
<artist>Bob Dylan</artist>
</cd>
<cd>
<title>Hide your heart</title>
</cd>
<cd>
<artist>Bob Dylan</artist>
<title>old_value</title>
<title>inbetween_value</title>
<title>new_value</title>
<artist>Freddie Mercury</artist>
<title>Don't stop me now</title>
</cd>
</catalog>"""
from xml.dom import minidom
doc = minidom.parseString(xml)
for cd in doc.getElementsByTagName("cd"):
elements = {}
for element in cd.childNodes:
if element.nodeType is not minidom.Node.ELEMENT_NODE:
continue
if element.tagName in elements:
cd.removeChild(element)
print("Removed duplicated " + element.tagName)
elements[element.tagName] = element
# doc.writexml(open("/path/to/file", "w"))