2010-03-24 6 views
2

Je suis en train de supprimer le « Cacher ces données » de ce code XML qui est procédé avec le type de qualification = « de NOVIEW »texte Remplacement après noeud

<element version="Local"> 
    <qualifier name="Public" type="View" /> 
    Good to go 
</element> 
<element version="Local"> 
<qualifier name="Public" type="noView" /> 
    Hide this data 
</element> 

J'utilise cette XSL

<?xml version="1.0"?> 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <xsl:apply-templates/> 
    </xsl:copy> 
    </xsl:template> 

<xsl:template match="qualifier"> 
    <xsl:call-template name="replace-noview" /> 
</xsl:template> 

<xsl:template name="replace-noview"> 
    <xsl:param name="text" select="@type"/> 

    <xsl:choose> 
    <xsl:when test="contains($text, 'noView')"> 
    <xsl:copy-of select="."/> 
    <xsl:text>DELETED</xsl:text> 
    </xsl:when> 
    <xsl:otherwise> 
    <xsl:copy-of select="."/> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

La sortie je reçois est

<element identifier="ContactName" version="Local"> 
<qualifier name="Public" type="View" /> 
Good to go 
</element> 
<element identifier="ContactName" version="Local"> 
<qualifier name="Public" type="noView" />DELETED 
Hide this data 
</element> 

Je suis l'attribut "noView" et je peux ajouter le texte "DELETED". Cependant, je dois supprimer le texte "Cacher ces données".

La sortie Je voudrais est

<element identifier="ContactName" version="Local"> 
<qualifier name="Public" type="View" /> 
Good to go 
</element> 
<element identifier="ContactName" version="Local"> 
<qualifier name="Public" type="noView" /> 
DELETED 
</element> 
+0

Bonne question! (+1). Voir ma réponse pour une solution compacte. Notez l'utilisation de la règle d'identité et sa substitution uniquement pour les nœuds de texte nécessitant un traitement spécial. L'utilisation et la substitution de la règle d'identité est l'un des modèles de conception XSLT les plus fondamentaux. –

Répondre

1

En supposant que l'élément pourrait contenir plus d'un texte ... essayez la feuille de style suivante:

<?xml version="1.0" encoding="utf-8" ?> 
<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 
    <xsl:output method="xml"/> 

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

    <xsl:template match="text()"> 
    <xsl:choose> 
     <xsl:when test="preceding-sibling::*[1][local-name() = 'qualifier' and @type='noView']"> 
    DELETED 
    </xsl:when> 
     <xsl:otherwise> 
     <xsl:copy-of select="."/> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 

</xsl:stylesheet> 

L'espacement est pertinent pour la sortie en l'élément choose. Alors que ça a l'air bien dans la sortie.

Si l'élément ne contient qu'un seul texte préfixé par qualifier, la feuille de style peut être rendue plus facile.

+0

+1, Ce code est correct. –

2

Cette transformation produit correctement le résultat souhaité:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

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

<xsl:template match="text() 
    [preceding-sibling::*[1]/@type='noView']"> 
    <xsl:text>DELETED</xsl:text> 
</xsl:template> 
</xsl:stylesheet> 

Lorsqu'il est appliqué sur le document XML fourni (corrigé pour être bien formé):

<t> 
<element version="Local"> 
    <qualifier name="Public" type="View" /> 
    Good to go 
</element> 
<element version="Local"> 
<qualifier name="Public" type="noView" /> 
    Hide this data 
</element> 
</t> 

Le résultat souhaité est produit:

Remarque l'utilisation de la règle d'identité et son remplacement uniquement pour les nœuds de texte qui nécessitent un traitement spécial. L'utilisation et la substitution de la règle d'identité est l'un des modèles de conception XSLT les plus fondamentaux.

+0

+1, c'est juste plus elgant ... :-) – AxelEckenberger

Questions connexes