复制文件没有重复

时间:2016-10-24 09:43:03

标签: xml xslt xslt-1.0

我有一个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>

1 个答案:

答案 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]) &gt; 1]"/>

</xsl:stylesheet>

身份复制模板,用于复制所有节点。是的,可以用xsl:copy-of ...的形式写这个,但我更喜欢这样的。评估自己,你的目标是什么。

通过 Muenchian分组删除所有重复的密钥条目。