web-dev-qa-db-fra.com

Différence entre * et node () dans XSLT

Quelle est la différence entre ces deux modèles?

<xsl:template match="node()">

<xsl:template match="*">
24
Svish
<xsl:template match="node()">

est l'abréviation de:

<xsl:template match="child::node()">

Cela correspond à tout type de nœud pouvant être sélectionné via the child:: axe:

  • élément

  • nœud de texte

  • nœud d'instruction de traitement (PI)

  • nœud de commentaire.

De l'autre côté:

<xsl:template match="*">

est l'abréviation de:

<xsl:template match="child::*">

Cela correspond à n'importe quel élément.

L'expression XPath: someAxis :: * correspond à n'importe quel nœud du type de nœud principal pour l'axe donné.

Pour le child:: l'axe du type de nœud principal est l'élément .

38
Dimitre Novatchev

Juste pour illustrer l'une des différences, à savoir que * Ne correspond pas à text:

Étant donné le xml:

<A>
    Text1
    <B/>
    Text2
</A>

Correspondance sur node()

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

    <!--Suppress unmatched text-->
    <xsl:template match="text()" />

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

    <xsl:template match="node()">
        <node>
            <xsl:copy />
        </node>
        <xsl:apply-templates />
    </xsl:template>
</xsl:stylesheet>

Donne:

<root>
    <node>
        <A />
    </node>
    <node>
        Text1
    </node>
    <node>
        <B />
    </node>
    <node>
        Text2
    </node>
</root>

Alors que la correspondance sur *:

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

Ne correspond pas aux nœuds de texte.

<root>
  <star>
    <A />
  </star>
  <star>
    <B />
  </star>
</root>
15
StuartLC

Reportez-vous également à XSL xsl: template match = "/" pour les autres modèles de correspondance.

2
Peter