2009-07-09 6 views
0

Je donne les résultats suivants:XSLT: Supprimer les noeuds en double sur la base attribut name

<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"/> 

Comment puis-je intégrer le noeud traitement des doublons en fonction de la xsl suivante:

<?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> 

Résultats attendus :

<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> 

Répondre

1

Cette copie la première simpleType distincte d'un nom, mais est un peu plus explicite avec le complexType « NameType »:

<?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> 

Notez que le modèle par défaut est surchargée de sorte que vous ne recevez pas les enfants non désirés de « NameType '.

+0

... Le même modèle avec la clé fonctionnera si vous voulez omettre les doublons de tout type complexe avec un nom correspondant. Si vous devez effectuer des comparaisons approfondies (c'est-à-dire, les enfants de la correspondance complexType ainsi que le nom), cela prendra probablement davantage de considération. – steamer25

+0

Aucune comparaison approfondie nécessaire, il suffit de modifier afin qu'il omis dupliqué complexType avec des noms correspondants. –

Questions connexes