2009-07-09 11 views
0

J'ai les xsd suivants Snippet:XSLT: Manipulation Noeud sélectif

<xs:complexType name="HighSchoolType"> 
    <xs:sequence> 
     <xs:element name="OrganizationName" type="core:OrganizationNameType"/> 
     <xs:group ref="core:OrganizationIDGroup" minOccurs="0"/> 
    </xs:sequence> 
</xs:complexType> 

Je veux gérer xs: balises d'élément différemment xs: étiquettes de groupe, tout en ignorant complètement xs: annotation et xs: balises de restriction. Quand j'ai un:

  • xs: balise d'élément, je veux le copier.
  • xs: étiquette de groupe, je veux que la sortie contienne les enfants de la balise xs: group tags.
  • Toute autre balise peut être ignorée, je ne veux pas dans ma sortie

J'ai essayé d'utiliser:

<xsl:template match="xs:complexType"> 
    <xsl:copy> 
     <xsl:choose> 
      <xsl:when test="*[self::xs:element]|@*"> 
       <xsl:copy-of select="."/> 
      </xsl:when> 
      <xsl:when test="*[self::xs:group]|@*"> 
       <xsl:apply-templates select="."/> 
      </xsl:when>    
     </xsl:choose> 
    </xsl:copy> 
</xsl:template> 

Je ne comprends pas pourquoi ceci:

<xsl:copy-of select="*[not(self::xs:annotation or self::xs:restriction)]|@*"/> 

... exclura xs: annotation & xs: restriction de nœuds tandis que

<xsl:when test="*[self::xs:element]|@*"> 
    <xsl:copy-of select="."/> 
</xsl:when> 

... retourne tout temps:

<xsl:when test="*[self::xs:group]|@*"> 
    <xsl:apply-templates select="."/> 
</xsl:when> 

... ne déclenche:

<xsl:variable name="core" select="document('CoreMain_v1.4.0.xsd')" /> 
<xsl:variable name="AcRec" select="document('AcademicRecord_v1.3.0.xsd')" /> 

<xsl:template match="xs:group[@ref]"> 
    <xsl:variable name="name" select="substring-after(@ref, ':')" /> 

    <xsl:choose> 
     <xsl:when test="substring-before(@ref, ':') = 'AcRec'">    
      <xsl:apply-templates select="$AcRec//*[@name=$name]" /> 
     </xsl:when> 
     <xsl:when test="substring-before(@ref, ':') = 'core'">    
      <xsl:apply-templates select="$core//*[@name=$name]" /> 
     </xsl:when>    
    </xsl:choose> 
</xsl:template> 

<xsl:template match="xs:group[@name]"> 
    <xsl:copy-of select="node()[not(self::xs:annotation|self::xs:restriction)]|@*"/> 
</xsl:template> 

Répondre

0

Changé:

<xsl:template match="xs:complexType"> 
    <xsl:copy> 
      <xsl:choose> 
        <xsl:when test="*[self::xs:element]|@*"> 
          <xsl:copy-of select="."/> 
        </xsl:when> 
        <xsl:when test="*[self::xs:group]|@*"> 
          <xsl:apply-templates select="."/> 
        </xsl:when>        
      </xsl:choose> 
    </xsl:copy> 
</xsl:template> 

... dans:

<xsl:template match="xs:complexType"> 
    <xsl:copy> 
    <xsl:for-each select="@*"> 
     <xsl:copy /> 
    </xsl:for-each> 
    <xsl:apply-templates select="node()" /> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="xs:sequence"> 
    <xsl:copy> 
    <xsl:for-each select="node()"> 
     <xsl:choose> 
     <xsl:when test="self::xs:element"> 
      <xsl:copy-of select="." /> 
     </xsl:when> 
     <xsl:when test="self::xs:group"> 
      <xsl:apply-templates select="."/> 
     </xsl:when>     
     </xsl:choose> 
    </xsl:for-each> 
    </xsl:copy> 
</xsl:template> 
Questions connexes