2012-08-22 16 views
18

Jaka jest różnica między tymi dwoma szablonami?Różnica między * i węzłem() w XSLT

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

<xsl:template match="*"> 
+0

Ta odpowiedź ma również zastosowanie: http://stackoverflow.com/questions/5394178/difference-between-childnode-and-child – StuartLC

Odpowiedz

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

jest skrótem:

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

Zastępuje typu węzła, który może być wybrany przez the child:: osi:

  • elementu

  • processing-instruction (PI) węzeł tekstowy węzeł

  • komentarz węzeł.

Z drugiej strony:

<xsl:template match="*"> 

jest skrótem od:

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

To pasuje do dowolnego elementu.

Wyrażenie XPath: someAxis :: * pasuje do dowolnego węzła podstawowego typu węzła dla danej osi.

Dla osi child:: podstawowym typem węzła jest element.

12

Żeby zilustrować jedną z różnic, a mianowicie, że * nie pasuje text:

Biorąc xml:

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

Matching na 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> 

Daje:

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

co następuje dopasowanie na *:

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

nie pasuje do węzłów tekstowych.

<root> 
    <star> 
    <A /> 
    </star> 
    <star> 
    <B /> 
    </star> 
</root> 
+1

Nie ma również "*" dopasowania węzłów komentarza, węzłów instrukcji przetwarzania, węzłów atrybutów, węzłów przestrzeni nazw i węzły dokumentu ... Wzorzec lub wyrażenie '*' (samo w sobie, jako abbr.dla 'child :: *') ** tylko zawsze pasuje do węzłów elementów i tylko węzłów elementów **. Używając '@ *', skrót od 'atrybut :: *', gwiazdka dopasowuje _only_ węzły atrybutu na osi atrybutu. – Abel

Powiązane problemy