2017-08-04 4 views
0

Je souhaite supprimer l'élément d'espace indésirable à l'aide de XSL.Nécessité de supprimer l'élément d'espace indésirable

XML Je teste:

<Body> 
    <h1>abc</h1> 
    <h1>efg</h1> 
    <p>efgh</p> 
    <h1> </h1> 
</Body> 

I utilisé XSL:

<xsl:template match="Body"> 
    <xsl:copy> 
     <xsl:for-each-group select="*" group-adjacent="boolean(self::h1)"> 
     <xsl:choose> 
      <xsl:when test="current-grouping-key()"> 
       <h1> 
        <xsl:apply-templates select="current-group()/node()"/> 
       </h1> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:apply-templates select="current-group()"/> 
      </xsl:otherwise> 
     </xsl:choose> 
     </xsl:for-each-group> 
    </xsl:copy> 
</xsl:template> 

sortie je reçois:

<Body> 
    <h1>abcefg</h1> 
    <p>efgh</p> 
    <h1> </h1> 
</Body> 

sortie Je voudrais:

<Body> 
    <h1>abcefg</h1> 
    <p>efgh</p> 
</Body> 

Je dois enlever l'élément ayant la valeur d'espace. S'il vous plaît donnez votre avis. Merci d'avance

+0

Je pense que vous devez expliquer plus en détail comment votre entrée peut avoir l'air et quel résultat vous voulez, ce qui est censé se produire si le le dernier élément 'h1' n'est pas vide ou rempli uniquement d'espaces blancs mais contient des données? Voulez-vous un nouveau groupe d'éléments 'h1'? –

Répondre

0

Je suppose, d'après la façon dont vous avez écrit votre document XSL, que vous souhaitez seulement fusionner les éléments h1. Je suppose en outre que vous seulement souhaitez supprimer "vide" h1 éléments. (. Il est une modification très simple si l'une de ces hypothèses ne sont pas vraies)

Dans cet esprit, voici une façon d'atteindre la puissance requise:

<xsl:strip-space elements="h1" /> 
<xsl:template match="Body"> 
    <xsl:copy> 
    <xsl:for-each-group select="*" group-adjacent="boolean(self::h1)"> 
     <xsl:choose> 
     <xsl:when test="current-grouping-key()"> 
      <xsl:if test="string-length(current-group()) > 0"> 
      <xsl:copy> 
       <xsl:apply-templates select="current-group()"/> 
      </xsl:copy> 
      </xsl:if> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:for-each select="current-group()"> 
      <xsl:copy> 
       <xsl:apply-templates/> 
      </xsl:copy> 
      </xsl:for-each> 
     </xsl:otherwise> 
     </xsl:choose> 
    </xsl:for-each-group> 
    </xsl:copy> 
</xsl:template> 

Avec une entrée XML dilatée pour mettre en valeur mon hypothèses:

<Body> 
    <h1>abc</h1> 
    <h1>efg</h1> 
    <p>efgh</p> 
    <p>ijkl</p> 
    <h2>mnop</h2> 
    <h1> </h1> 
    <p> </p> 
</Body> 

la sortie est:

<Body> 
    <h1>abcefg</h1> 
    <p>efgh</p> 
    <p>ijkl</p> 
    <h2>mnop</h2> 
    <p> </p> 
</Body> 

la clé de la solution est l'élément xsl:strip-space couplé à la fonction string-length(). Cela se traduit par h1 chaque élément avec quantité, et seulement, l'espace blanc étant supprimé.

J'ai également corrigé un bogue majeur au second élément xsl:apply-templates qui entraînerait la fusion de toutes les suites consécutives d'éléments non h1. (Vous devez parcourir tous les nœuds de l'ensemble de nœuds current-group() pour éviter cela.)

+0

Merci @robin. Cela fonctionne bien – User501