XSLT:基于名称属性删除重复节点

XSLT:基于名称属性删除重复节点,xslt,Xslt,我有以下资料: <xs:schema> <xs:complexType name="NameType"> <xs:sequence> <xs:element name="NamePrefix" type="core:NamePrefixType" minOccurs="0"/> <xs:element name="FirstName" type="core:FirstNameType" minOccur

我有以下资料:

<xs:schema>
<xs:complexType name="NameType">
    <xs:sequence>
        <xs:element name="NamePrefix" type="core:NamePrefixType" minOccurs="0"/>
        <xs:element name="FirstName" type="core:FirstNameType" minOccurs="0"/>
        <xs:element name="MiddleName" type="core:MiddleNameType" minOccurs="0" maxOccurs="10"/>
        <xs:element name="LastName" type="core:LastNameType" minOccurs="0"/>
        <xs:element name="NameSuffix" type="core:NameSuffixType" minOccurs="0"/>
        <xs:element name="NameTitle" type="core:NameTitleType" minOccurs="0"/>
        <xs:element name="CompositeName" type="core:CompositeNameType" minOccurs="0"/>
        <xs:element name="NoteMessage" type="core:NoteMessageType" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
</xs:complexType>
<xs:simpleType name="NamePrefixType"/>
<xs:simpleType name="FirstNameType"/>
<xs:simpleType name="MiddleNameType"/>
<xs:simpleType name="LastNameType"/>
<xs:simpleType name="NameSuffixType"/>
<xs:simpleType name="NameTitleType"/>
<xs:simpleType name="CompositeNameType"/>
<xs:simpleType name="NoteMessageType"/>
<xs:complexType name="NameType">
    <xs:sequence>
        <xs:element name="NamePrefix" type="core:NamePrefixType" minOccurs="0"/>
        <xs:element name="FirstName" type="core:FirstNameType" minOccurs="0"/>
        <xs:element name="MiddleName" type="core:MiddleNameType" minOccurs="0" maxOccurs="10"/>
        <xs:element name="LastName" type="core:LastNameType" minOccurs="0"/>
        <xs:element name="NameSuffix" type="core:NameSuffixType" minOccurs="0"/>
        <xs:element name="NameTitle" type="core:NameTitleType" minOccurs="0"/>
        <xs:element name="CompositeName" type="core:CompositeNameType" minOccurs="0"/>
        <xs:element name="NoteMessage" type="core:NoteMessageType" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
</xs:complexType>
<xs:simpleType name="NamePrefixType"/>
<xs:simpleType name="FirstNameType"/>
<xs:simpleType name="MiddleNameType"/>
<xs:simpleType name="LastNameType"/>
<xs:simpleType name="NameSuffixType"/>
<xs:simpleType name="NameTitleType"/>
<xs:simpleType name="CompositeNameType"/>
<xs:simpleType name="NoteMessageType"/>

如何基于以下xsl集成重复节点处理:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="core AcRec">

 <xsl:template match="/xs:schema">
   <xsl:copy>
     <xsl:apply-templates />
     <xsl:copy-of select="//xs:simpleType" />
   </xsl:copy>
 </xsl:template>

 <xsl:template match="*[name()!='xs:simpleType' and name()!='xs:schema']">
   <xsl:copy>
     <xsl:apply-templates select="*|@*"/>
   </xsl:copy>
 </xsl:template>

  <xsl:template match="@*">
    <xsl:copy-of select="." />
  </xsl:template>       
</xsl:stylesheet>

预期产出:

<xs:schema>
  <xs:complexType name="NameType">
    <xs:sequence>
      <xs:element name="NamePrefix" type="core:NamePrefixType" minOccurs="0"/>
      <xs:element name="FirstName" type="core:FirstNameType" minOccurs="0"/>
      <xs:element name="MiddleName" type="core:MiddleNameType" minOccurs="0" maxOccurs="10"/>
      <xs:element name="LastName" type="core:LastNameType" minOccurs="0"/>
      <xs:element name="NameSuffix" type="core:NameSuffixType" minOccurs="0"/>
      <xs:element name="NameTitle" type="core:NameTitleType" minOccurs="0"/>
      <xs:element name="CompositeName" type="core:CompositeNameType" minOccurs="0"/>
      <xs:element name="NoteMessage" type="core:NoteMessageType" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <xs:simpleType name="NamePrefixType"/>
  <xs:simpleType name="FirstNameType"/>
  <xs:simpleType name="MiddleNameType"/>
  <xs:simpleType name="LastNameType"/>
  <xs:simpleType name="NameSuffixType"/>
  <xs:simpleType name="NameTitleType"/>
  <xs:simpleType name="CompositeNameType"/>
  <xs:simpleType name="NoteMessageType"/>
</xs:schema>

这复制了任何名称的第一个不同的simpleType,但对于“NameType”complexType则更为明确:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="core AcRec"
    xmlns:core="foo" xmlns:AcRec="bar">

    <xsl:key name="simpleTypes" match="xs:simpleType" use="@name"/>

    <xsl:template match="/xs:schema">
        <xsl:copy>
            <xsl:copy-of select="xs:complexType[@name='NameType'][1]"/>
            <xsl:apply-templates />
            <xsl:copy-of select="//xs:simpleType[generate-id(.) = generate-id(key('simpleTypes', @name)[1])]" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*[name()!='xs:simpleType' and name()!='xs:schema' and @name!='NameType']">
        <xsl:copy>
            <xsl:apply-templates select="*|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="@*">
        <xsl:copy-of select="." />
    </xsl:template>

    <xsl:template match="*"/>
</xsl:stylesheet>


请注意,默认模板已被覆盖,这样您就不会得到“NameType”的不需要的子项。

…如果您希望省略任何具有匹配名称的complexType的重复项,则使用相同的键模式将起作用。如果您需要进行深度比较(即complexType的子项与名称匹配),则可能需要进一步考虑。无需进行深度比较,只需进行调整,以便省略具有匹配名称的重复complexType。