RE: [xsl] NAMESPACES - Part 2 of (Moving an element to a new location in the Result-tree)

Subject: RE: [xsl] NAMESPACES - Part 2 of (Moving an element to a new location in the Result-tree)
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Sat, 10 Sep 2005 08:38:38 +0100
When you say match="Transfer", that's a shorthand for "match elements whose
local name is Transfer and whose namespace URI is null". It won't match a
Transfer element in a non-null namespace, even if that namespace is the
default namespace in the source document and/or in the stylesheet.

My usual advice to people handling two variants of a vocabulary, one with
namespaces and one without, is: don't try and write a stylesheet that
handles both. Instead, write a stylesheet that converts from one variant to
the other, and run this as a preprocessor when necessary before running your
main stylesheet.

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

 

> -----Original Message-----
> From: Graves, Jim (CONTR) [mailto:jim.graves@xxxxxxx] 
> Sent: 10 September 2005 04:30
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Cc: swguild@xxxxxxxxxxxxxx
> Subject: [xsl] NAMESPACES - Part 2 of (Moving an element to a 
> new location in the Result-tree)
> 
> 
> This is a follow-on question related to my earlier one about: 
> "Moving an element to a new location in the Result-tree." 
> (my new QUESTION is stated below) -- (And thanks for your 
> prior help!!)
> 
> Please Cc: my home e-mail, so I can see your reply from home this
> weekend?)
> 'swguild@xxxxxxxxxxxxxx'
> 
> Essentially I have two version of input data one with and one without
> namespaces, so my XSLT works on the latter, not former (the namespaces
> are causing problems).
> 
> My 'toy version' of the input data file works just fine w.r.t. its
> intent,
> namely creating a new file (containing the newly formed 'result-tree')
> in which the <INDIVIDUAL_ALIAS> elements have been 'herded down,' to
> their new home in the tree, (as I refer to moving my 'data elephants'
> sometimes) (;>}
> (Forgive my levity, but it's Friday night -- and I should be home by
> now).
> 
> However, now I have to resolve why my XSLT, shown below, is processing
> differently on the files that only differ with respect to the presence
> or absence of namespaces: (I'm using XMLSpy version 2005 
> release 3 (for
> development/debugging), of Ent. Edn. and the (nearly latest) .NET XSLT
> 1.1, but not 2.0, (it's used for production) -- (BTW, how can 
> I get XSLT
> 2.0 in there, if it's possible?)).
> 
> As I see it, when debugging down through the code in XMLSpy, 
> without the
> namespaces, everything flows perfectly and life is good, (:>}.
> Then, when I introduce the 'real data,' with namespaces and prefixes,
> etc, the XSLT process chooses to follow a different sequence; see data
> versions. 
> 
> Specifically, it avoids my template named "Transfer" (-- apparently
> disregarding the 'optional' priority value): (without the 
> namespaces in
> the data, it uses this template and all is well).
> 
> <xsl:template match="Transfer" priority="5.0">
>  <Transfer>
>  <IND>
> 		  <xsl:apply-templates select="IND"/>
>  </IND>	
> </Transfer>
> 
> 
> and then consumes the entire file with the 'node-eater' (via 
> <xsl:copy):
> 
> 
> <xsl:template match="@*|node()" >
> 	   <xsl:copy>
> 		  <xsl:apply-templates select="@*|node()"/>
> 	  </xsl:copy>  
> </xsl:template>
> 
> 
> In this case, having the disastrous result of omitting my key 
> template:
> (the 'Good Shepard template' ("IND") who herds my data elephants down
> the tree..)
> 
> <xsl:template match="IND" priority="4.0">
>             <xsl:apply-templates
> select="*[not(self::INDIVIDUAL_ALIAS)]"/>    
>             <xsl:apply-templates select="INDIVIDUAL_ALIAS" />
> 
> </xsl:template>
> 
> Without this execution, I fail to obtain my desired result and life is
> bad.
> 
> MY QUESTION: since I need to have these (and several other
> namespaces/prefixes, such as: 
> xmlns:ABC="http://www.abc.xyz.pdq/ABC"; and
> several others (must haves)), so then, what can I do to mitigate the
> effect of their presence in the input data tree? 
> 
> This problem happens immediately, prior to when it gets to my first
> element, since it's not shown as highlighted in XMLSpy, if namespaces
> are present, yet if they are not present, then the tag is highlighted
> and all flows well).  (Something happening behind the scenes 
> in the XSLT
> process (what?). 
> 
> Again:
> 
> "<Transfer>" (is OK), however, 
> 
> 
> "<Transfer xmlns:xs="http://www.w3.org/2001/XMLSchema"; (is 
> not OK; skips
> the special template, "IND").
> 
> 
> 
> INPUT DATA
> 
> Less Complex Input (without namespaces):
> <Transfer>
> <IND> 
> <NAME_LAST>PEITER</NAME_LAST>
> <NAME_FIRST>ED</NAME_FIRST>
> <NAME_MIDDLE>WARECO</NAME_MIDDLE>
> 
> <INDIVIDUAL_ALIAS>
> <IND_ALIAS_TYPE>UNKNOWN</IND_ALIAS_TYPE>
> <Name>DASTEFANO,ALEX</Name>
> </INDIVIDUAL_ALIAS>
> 
> <INDIVIDUAL_ALIAS>
> <IND_ALIAS_TYPE>UNKNOWN</IND_ALIAS_TYPE>
> <Name>PURSA, NILLIAM, JR</Name>
> </INDIVIDUAL_ALIAS>
> 
> <BIRTH_DATE>19510515</BIRTH_DATE>
> <GENDER>M</GENDER>
> <IND_HEIGHT>67"</IND_HEIGHT>
> <IND_WEIGHT>150</IND_WEIGHT>
> <EYE_COLOR>Brown</EYE_COLOR>
> <HAIR_COLOR>Brown</HAIR_COLOR>
> 
> </IND>
> </Transfer>
> 
> 
> More Complex Input (with namespaces, causing problems):
> 
> <Transfer 
> xmlns:xs="http://www.w3.org/2001/XMLSchema";
> xmlns:fn="http://www.w3.org/2005/02/xpath-functions";
> xmlns:xdt="http://www.w3.org/2005/02/xpath-datatypes";> 
> 
> <IND> NAME_LAST>PEITER</NAME_LAST>
> <NAME_FIRST>ED</NAME_FIRST>
> <NAME_MIDDLE>WARECO</NAME_MIDDLE>
> 
> <INDIVIDUAL_ALIAS>
> <IND_ALIAS_TYPE>UNKNOWN</IND_ALIAS_TYPE>
> <Name>DASTEFANO,ALEX</Name>
> </INDIVIDUAL_ALIAS>
> 
> <INDIVIDUAL_ALIAS>
> <IND_ALIAS_TYPE>UNKNOWN</IND_ALIAS_TYPE>
> <Name>PURSA, NILLIAM, JR</Name>
> </INDIVIDUAL_ALIAS>
> 
> <BIRTH_DATE>19510515</BIRTH_DATE>
> <GENDER>M</GENDER>
> <IND_HEIGHT>67"</IND_HEIGHT>
> <IND_WEIGHT>150</IND_WEIGHT>
> <EYE_COLOR>Brown</EYE_COLOR>
> <HAIR_COLOR>Brown</HAIR_COLOR>
> 
> </IND>
> </Transfer> 
> 
> 
> XSLT:
> 
> <?xml version="1.0" encoding="UTF-8" ?>
> <xsl:stylesheet version="1.0" 
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; >
> <xsl:output version="1.0" method="xml" omit-xml-declaration="no"
> encoding="UTF-8" indent="yes"/>
> 
> <xsl:strip-space elements="*"/>
> 
> <xsl:template match="/">
>              <xsl:copy>
> 		   <xsl:apply-templates select="*"/>
> 		 </xsl:copy>      	
> </xsl:template> 
> 
> <xsl:template match="Transfer" priority="5.0">
>    <Transfer>
>      <IND>
> 		  <xsl:apply-templates select="IND"/>
>      </IND>	
>    </Transfer>
> 	     
> </xsl:template>
> 
> <xsl:template match="IND" priority="4.0">
>   
>             <xsl:apply-templates
> select="*[not(self::INDIVIDUAL_ALIAS)]"/>    
>             <xsl:apply-templates select="INDIVIDUAL_ALIAS" />
> 
> </xsl:template>
> 
>  <xsl:template match="@*|node()" >
>       	 <xsl:copy>
> 		      <xsl:apply-templates select="@*|node()"/>
> 	       </xsl:copy>  
>  </xsl:template>
> 
> </xsl:stylesheet>

Current Thread