2009-08-20 9 views
0

Hallo, tout d'abord, je ne suis pas très familier quand il est au format XML et similaire, alors s'il vous plaît ne pas me punir de ma question débutant: DComment éviter les paramètres avec tout en dedans?

J'ai un fichier xml qui ressemble à ceci:

<?xml version="1.0" encoding="utf-8" ?> 
<mainstuff> 
    <category_major> 
     <project_name>Dream</project_name> 
     <project_attribute>Version 1.0</project_attribute> 
     <category_A></category_A> 
     <category_B></category_B> 
     <category_C></category_C> 
    </category_major> 
</mainstuff> 

Puis je me suis un fichier XSLT qui ressemble à ceci:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" 
> 
    <xsl:output method="xml" indent="yes"/> 

    <!--<xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template>--> 

    <xsl:template match="/"> 
    <xsl:element name="mainstuff"> 
     <xsl:attribute name="version">1.0</xsl:attribute> 
     <xsl:apply-templates/> 
    </xsl:element>  
    </xsl:template> 

    <xsl:template match="category_major"> 
    <xsl:element name="category_major"> 
     <xsl:apply-templates/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="category_A"> 
    <xsl:element name="category_A"> 
     <xsl:apply-templates/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="category_B"> 
    <xsl:element name="category_B"> 
     <xsl:apply-templates/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="category_C"> 
    <xsl:element name="category_C"> 
     <xsl:apply-templates/> 
    </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

Je veux éviter les deux paramètres « PROJECT_NAME » et « project_attribute ». Je veux un résultat comme celui-ci:

<?xml version="1.0" encoding="utf-8" ?> 
<mainstuff> 
    <category_major> 
     <category_A></category_A> 
     <category_B></category_B> 
     <category_C></category_C> 
    </category_major> 
</mainstuff> 

Mais ce que je reçois est ceci après tranformation:

<?xml version="1.0" encoding="utf-8"?> 
<mainstuff version="1.0"> 
    <category_major> 
     **Dream 
     Version 1.0** 
     <category_A /> 
     <category_B /> 
     <category_C /> 
    </category_major> 
</mainstuff> 

Le texte est toujours en elle. Comment puis-je le réparer. Qu'est-ce que je fais mal ? Et comment puis-je réaliser pour obtenir des paramètres mais sans le texte à l'intérieur? Dans mon exemple, une sortie comme ceci:

<?xml version="1.0" encoding="utf-8" ?> 
<mainstuff> 
    <category_major> 
     **<project_name></project_name> 
     <project_attribute></project_attribute>** 
     <category_A></category_A> 
     <category_B></category_B> 
     <category_C></category_C> 
    </category_major> 
</mainstuff> 

Merci pour votre aide: D

+0

S'il vous plaît préciser - quel résultat Veux-tu? Vous avez demandé le résultat sans les paramètres et leurs valeurs et à la fin vous avez demandé les paramètres sans leurs valeurs? –

+0

Je veux chaque résultat. Un par un: D – Camal

Répondre

2

S'il n'y a pas de modèle correspondant à un élément, un modèle par défaut utilisé se. L'effet du modèle par défaut est effectivement de sortir la valeur de chaîne du nœud - pour un élément, il ressemble à une concaténation de tous les nœuds de texte descendant.

Si vous voulez modifier ce comportement, vous devez fournir vos propres modèles non-op pour les éléments que vous souhaitez sauter:

<xsl:template match="project_name | project_attribute" /> 

Pour votre deuxième demande, si vous voulez afficher l'élément, mais dépouiller tous les contenus, vous pouvez utiliser xsl:copy:

<xsl:template match="project_name | project_attribute"> 
    <xsl:copy /> 
</xsl:template> 

Notez que xsl:copy ne copie l'élément; il ne copie pas ses attributs, ni ses enfants.

+0

Thanks fonctionne bien: D – Camal

0

Essayez inverser, correspondent à ce que vous voulez exclure, pas ce que vous voulez inclure:

<xsl:template match="/"> 
    <xsl:apply-templates /> 
</xsl:template> 

<xsl:template match="*" priority="0"> 
    <xsl:element name="{local-name()}"> 
     <xsl:apply-templates /> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="project_name" priority="1"></xsl:template> 
<xsl:template match="project_attribute" priority="1"></xsl:template> 

Désolé si cela est un peu cryptique, mais j'espère que cela aide

+0

La transformation d'identité (qui est ce que vous essayez d'utiliser pour 'match =" * "') est mieux écrite en utilisant 'xsl: copy'. De même, il n'y a pas besoin de priorités explicites - la priorité d'un modèle correspondant à "*" sera toujours inférieure à la priorité d'un modèle correspondant à un élément nommé. –

+0

les priorités sont pour la lisibilité de ce qui est prioritaire, j'inclue toujours la priorité = "0" sur les gabarits censés être remplacés, style personnel et non, xsl: la copie ne s'appliquera pas aux gabarits sur les éléments enfants, ce qui est requis pour cela solution au travail – LorenVS

+0

Vous pouvez utiliser '' (ou tout autre constructeur) dans ''. –

Questions connexes