Re: [xsl] stylesheet not work when xmlns exist

Subject: Re: [xsl] stylesheet not work when xmlns exist
From: Florent Georges <lists@xxxxxxxxxxxx>
Date: Sun, 27 Sep 2009 20:28:03 +0000 (GMT)
Michael Kay wrote:

  Hi,

> >     <xsl:template match="/Request">
> >    
<data>
> >     <Elem n="{name(.)}">
> >     <xsl:for-each select="@*">
> >    
<xsl:if test="name(.)='System'">
> >         <attr n="{name(.)}">
> >        
<xsl:element name="val">
> >             <xsl:attribute name="s">
> >       
<xsl:value-of select="normalize-space(.)"/>
> >             </xsl:attribute>
>
>           </xsl:element>
> >         </attr>
> >     </xsl:if>
> >    
</xsl:for-each>
> >     <xsl:apply-templates/>
> >     </Elem>
> >     </data>
> >     </xsl:template>

> > I only want to get the "System" attribute and
ignore
> > all the rest.

> Then why not replace the xsl:for-each and xsl:if
by
> <xsl:for-each select="@System">?

> In fact, the whole thing could be
rewritten:

> <xsl:template match="/Request">
> <data>
>   <Elem
name="Request">
>      <attr n="System">
>         <val s="{@System}"/>
>  
   </attr>
>   </Elem>
> </data>
> </xsl:template>

  Or more precisely:
<xsl:template match="/Request">
       <data>
          <Elem name="Request">
<xsl:if test="@System">
                <attr n="System">
<val s="{ @System }"/>
                </attr>
             </xsl:if>
</Elem>
       </data>
    </xsl:template>

or maybe more intuitively (but
depends on the exact problem and context):

    <xsl:template
match="/Request">
       <data>
          <Elem name="Request">
<xsl:apply-templates select="@System"/>
          </Elem>
       </data>
</xsl:template>

    <xsl:template match="@*">
       <attr n="{ name(.) }">
<val s="{ . }"/>
       </attr>
    </xsl:template>

  Regards,

-- 
Florent
Georges
http://www.fgeorges.org/

Current Thread