2017-06-22 1 views
0
correspondance

J'ai un xsl avec un extrait qui ressemble à ceci:modèle XSL tout sauf quelque chose

<xsl:template match="group"> 
<xsl:element name="group"> 
<xsl:copy-of select="*"/> 
</xsl:element> 
</xsl:template> 

Cependant, je besoin de copier tous les groupes sauf ceux qui ont le typevalue « RECORD ». Comment puis-je faire cela? Je peux utiliser à la fois XSL 1.0 et 2.0, avec 1.0 préféré. Le fichier source contient plusieurs milliers de groupes, avec 4-5 valeurs de type différentes. Je veux que le code sélectionne seulement les groupes sans la valeur de type RECORD.

est ici un groupe exemple qui devrait être éliminé par filtration:

<group recstatus="1"> 
    <sourcedid> 
     <source>system_owner_28f57240-5e2b-44af-8e62-fbf9aa6b6165</source> 
     <id>basic_groups_69782a81-042d-4717-b9e4-18abacb306b7</id> 
    </sourcedid> 
    <grouptype> 
     <scheme>Unique</scheme> 
     <typevalue level="0">RECORD</typevalue> 
    </grouptype> 
    <description> 
     <short>Ipsum dipsum</short> 
    </description> 
    <relationship> 
     <sourcedid> 
     <source>system_owner_28f57240-5e2b-44af-8e62-fbf9aa6b6165</source> 
     <id>69782a81-042d-4717-b9e4-18abacb306b7</id> 
     </sourcedid> 
     <label>Ipsum dipsum</label> 
    </relationship> 
</group> 

Un grand merci pour tous et toute aide!

+0

Alors quelle sortie voulez-vous pour cet exemple d'entrée que vous avez montré? –

+0

Il serait préférable de faire ce filtrage en appliquant des modèles de manière sélective, et non en restreignant le modèle de correspondance. Autrement, le 'groupe' non concordant sera traité par le modèle par défaut. –

+0

Excuses si je n'étais pas clair. Le fichier source contient plusieurs milliers de groupes, avec 4-5 valeurs de type différentes. Je veux que le code sélectionne seulement les groupes sans la valeur de type RECORD. –

Répondre

1

Si vous utilisez

<xsl:template match="/*"> 
    <xsl:copy> 
    <xsl:copy-of select="//group[not(grouptype/typevalue[level = 0] = 'RECORD')]"/> 
    </xsl:copy> 
</xsl:template> 

vous copier ces éléments group ne pas avoir ce descendant typevalue étant RECORD.

Ou, si vous voulez utiliser le modèle de transformation d'identité pour copier tout puis inverser la condition pour ne pas copier les éléments que vous voulez éliminer avec un modèle vide

<xsl:template match="group[grouptype/typevalue[level = 0] = 'RECORD']"/> 
+0

Merci, cela semble faire l'affaire. Malheureusement, le fichier XML contient également plusieurs milliers d'éléments et que je dois conserver, et ceux-ci sont maintenant filtrés. –

+0

Eh bien, la prochaine fois que vous envisagez de montrer un échantillon réduit mais complet et minimal de l'entrée XML, XSLT vous avez, la sortie que vous voulez et celui que vous obtenez pour illustrer le problème. J'ai modifié la réponse pour montrer une approche alternative avec un modèle ne copiant pas les éléments que vous voulez supprimer, il suppose que vous mettez également le modèle de transformation d'identité dans votre code comme point de départ pour gérer le reste. –

+0

Je le ferai, merci. Votre réponse révisée a fonctionné comme un charme. –

0

Prenant à la lettre votre question, la plus directe représentation XSLT de l'exigence est d'avoir deux règles de modèle:

<xsl:template match="*[everything()]" priority="10"> 
    .. 
</xsl:template> 

<xsl:template match="*[something()]" priority="20"/> 

qui est une règle qui correspond à « quelque chose » et ne fait rien, et une règle de priorité inférieure qui correspond à « tout » et fait quelque chose.