我有一个XML文件,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:stuff>
<xs:nestedStuff name="nested"/>
</xs:stuff>
<xs:simpleType name="A_B">
<xs:union memberTypes="xs:A xs:B"/>
</xs:simpleType>
<xs:simpleType name="A_B_C">
<xs:union memberTypes="xs:A xs:B xs:C"/>
</xs:simpleType>
<xs:simpleType name="A_B">
<xs:union memberTypes="xs:A xs:B"/>
</xs:simpleType>
<xs:simpleType name="A_B">
<xs:union memberTypes="xs:A xs:B"/>
</xs:simpleType>
<xs:simpleType name="A_B_C">
<xs:union memberTypes="xs:A xs:B xs:C"/>
</xs:simpleType>
<xs:simpleType name="A_C">
<xs:union memberTypes="xs:A xs:C"/>
</xs:simpleType>
</xs:schema>
我想要做的是复制此文件的每一行,除了重复的simpleType
元素,以便我得到
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:stuff>
<xs:nestedStuff name="nested"/>
</xs:stuff>
<xs:simpleType name="A_B">
<xs:union memberTypes="xs:A xs:B"/>
</xs:simpleType>
<xs:simpleType name="A_B_C">
<xs:union memberTypes="xs:A xs:B xs:C"/>
</xs:simpleType>
<xs:simpleType name="A_C">
<xs:union memberTypes="xs:A xs:C"/>
</xs:simpleType>
</xs:schema>
我不能使用XLST-2.0。我是XSLT的新手,我尝试了here的各种各样的东西,但它并不像我想象的那样适用于我的问题。这是我尝试的一个例子,它导致输出完全等于输入:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:for-each select="simpleType/@name[not(.=preceding::*)]">
<xsl:element name="xs:TEST">
</xsl:element>
</xsl:for-each>
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:1)
<强>予。有效的XML
您显示的xml格式不正确且无效。您必须关闭代码xs:nestedStuff
。并不那么重要,因为我认为这是一个缩小的例子。只是说。
II:1.0 XSLT
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:key match="xs:simpleType" use="@name" name="key-for-types"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="xs:simpleType[count(. | key('key-for-types', @name)[1]) > 1]"/>
</xsl:stylesheet>
身份复制模板,用于复制所有节点。是的,可以用xsl:copy-of ...
的形式写这个,但我更喜欢这样的。评估自己,你的目标是什么。
通过 Muenchian分组删除所有重复的密钥条目。