75 votes

Pourquoi ne XSLT sortie tout le texte par défaut?

Salut, j'avais effectué une transformation qui laisse tomber une étiquette si elle est nulle.

Je voulais vérifier si ma transformation fonctionne bien, donc au lieu de vérifier manuellement, j'ai écrit un plus XSLT code qui vérifie juste la présence de cette balise dans le XML de SORTIE, si elle est nulle, alors la deuxième XSLT doit la sortie d'un texte "TROUVÉ". (Je n'ai pas vraiment besoin d'un peu de XML au type de sortie, mais je suis juste en utilisant XSLT pour la recherche.)

Quand j'ai essayé avec ce code XSL ::

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/SiebelMessage//SuppressCalendar[.!='']">
      FOUND
  </xsl:template>
</xsl:stylesheet>

Il affiche toutes les DONNÉES de TEXTE qui est présent dans le fichier XML,

pour éviter cela, j'ai dû écrire ce code::

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/SiebelMessage//SuppressCalendar[.!='']">
      FOUND
  </xsl:template>
  <xsl:template match="text()"/>
</xsl:stylesheet>

pourquoi l'ancien code des sorties de TEXTE, pourquoi devrais-je insister XSL ignorer tous les autres textes? c'est que le comportement de tous les parseurs XML ou seulement de mon propre (je suis à l'aide de l'analyseur msxml).

149voto

Dimitre Novatchev Points 147842

pourquoi l'ancien code des sorties de TEXTE, pourquoi devrais-je insister XSL pour ignorer toutes les un autre texte? c'est que le comportement de tous les parseurs XML ou seulement de mon propre

Vous êtes à la découverte de l'une des plus fondamentales fonctionnalités XSLT, comme spécifié dans le cahier des charges: les modèles intégrés de XSLT.

À partir de la spécification:

Il y a un modèle intégré de la règle de permettre récursive de continuer le traitement en l'absence d'un motif réussie match par un modèle explicite de la règle de la feuille de style. Ce modèle de la règle s'applique à la fois les nœuds d'élément et de la nœud racine. La figure suivante montre la l'équivalent du modèle intégré la règle:

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

Il y a aussi un modèle intégré de la règle pour chaque mode, ce qui permet récursive le traitement de continuer dans la même mode en l'absence d'un succès mise en correspondance du modèle par un modèle explicite la règle dans la feuille de style. Ce modèle la règle s'applique à la fois les nœuds d'élément et le nœud racine. La figure suivante montre la l'équivalent du modèle intégré la règle pour le mode m.

<xsl:template match="*|/" mode="m">
  <xsl:apply-templates mode="m"/>
</xsl:template>

Il y a aussi un modèle intégré de la règle pour le texte et les nœuds d'attribut des copies de texte par le biais de:

<xsl:template match="text()|@*">
  <xsl:value-of select="."/>
</xsl:template>

Le modèle intégré de la règle de les instructions de traitement et les commentaires est de ne rien faire.

<xsl:template match="processing-instruction()|comment()"/>

Le modèle intégré de la règle de espace de noms de nœuds est de ne rien faire. Il n'y a pas de modèle qui peut correspondre à un nœud d'espace de noms; ainsi, le modèle la règle est le seul modèle la règle qui est appliquée pour l'espace de noms les nœuds.

Le modèle intégré les règles sont traités comme s'ils étaient importés implicitement avant de la feuille de style et donc, avoir une baisse des importations de priorité que toutes les autres règles de modèle. Ainsi, l' l'auteur peut remplacer un haut- modèle de règle en incluant explicitement modèle la règle.

Ainsi, le comportement est le résultat de l'application de la intégré dans les modèles -- le 1er et le 2ème de tous les trois d'entre eux.

C'est une bonne XSLT modèle de conception pour remplacer les modèles intégrés avec votre propre à émettre un message d'erreur à chaque fois afin que le programmeur sait immédiatement sa transformation est une "fuite":

Par exemple, si il est présent document XML:

<a>
  <b>
    <c>Don't want to see this</c>
  </b>
</a>

et il est traité avec cette transformation:

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

 <xsl:template match="a|b">
   <xsl:copy>
      <xsl:attribute name="name">
        <xsl:value-of select="name()"/>
      </xsl:attribute>
      <xsl:apply-templates/>
   </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

le résultat est:

<a name="a">
   <b name="b">Don't want to see this</b>
</a>

et le programmeur va être très confus comment le texte non désiré est apparu.

Cependant, juste en ajoutant cette catch-all template permet d'éviter toute confusion et de repérer les erreurs immédiatement:

 <xsl:template match="*">
  <xsl:message terminate="no">
   WARNING: Unmatched element: <xsl:value-of select="name()"/>
  </xsl:message>

  <xsl:apply-templates/>
 </xsl:template>

Maintenant, en plus de la confusion de la sortie le programmeur obtient un avertissement qui explique le problème immédiatement:

 WARNING: Unmatched element: c

14voto

Oded Points 271275

Il y a plusieurs construite dans les règles de modèle dans XSL, dont l'un est ceci:

<xsl:template match="text()|@*">
  <xsl:value-of select="."/>
</xsl:template>

C'sorties de texte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X