代码之家  ›  专栏  ›  技术社区  ›  OMG Ponies

xslt:基于name属性删除重复节点

  •  0
  • OMG Ponies  · 技术社区  · 15 年前

    我有以下几点:

    <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>
    
    1 回复  |  直到 15 年前
        1
  •  1
  •   steamer25    15 年前

    这将复制任何名称的第一个非重复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”不需要的子项。