RE: [xsl] stylesheet not work when xmlns exist

Subject: RE: [xsl] stylesheet not work when xmlns exist
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Sat, 26 Sep 2009 22:26:40 +0100
> I am on xlst 1.0,
> 
> This is my stylesheet,
> 
> 	<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>

> 
> 
> THE PROBLEM arise when the input is with xmlns without prefix 
> "xsi", the output that is output-3 as below:
> 
> input-3: Remove the xsi prefix from xmlns <?xml version="1.0" 
> encoding="UTF-8"?> <Request xmlns="http://www.abc.com";  
> System="mysystem"> </Request>
> 
> 
> I have no idea why "xmlns" is causing problem here?
> 

Because a template written to match an element with local name Request in no
namespace will not match an element with local name Request in namespace
http://www.abc.com. The namespace is logically part of the element name.

Regards,

Michael Kay
http://www.saxonica.com/
http://twitter.com/michaelhkay 

Current Thread