[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

RE: xsl:copy-of O.K. on RTF, but nothing on <EMPTY/> e

Subject: RE: xsl:copy-of O.K. on RTF, but nothing on <EMPTY/> element content (?)
From: "William Reilly" <wreilly@xxxxxxxxxxx>
Date: Wed, 23 Apr 2003 17:30:01 -0400
pic gif
My basic question:
(follow-on to my yesterday e-mail)


>> What is the difference in these two bits of markup, from the point of
the
 XSLT processor, working on an <xsl:apply-templates> or an <xsl:copy-of>
instruction? <<

			+++++++++++++++++++++++++++++++++++++++++++
CODE #1:		<markup> <img src="pic.gif"/></markup>       <<
RTF
			+++++++++++++++++++++++++++++++++++++++++++
			+++++++++++++++++++++++++++++++++++++++++++
CODE #2:		<markup><img src="pic.gif"/></markup>        <<
nodeset (I believe(?))
			+++++++++++++++++++++++++++++++++++++++++++



- KEYSTROKES
The simple difference in keystrokes is one has a space between elements
((#1) <markup> <img>), 
the other doesn't ((#2) <markup><img>).

- TREE of NODES
The difference in the tree of nodes visited by the XSLT processor (as
revealed by 
CraneSoftwrights "showtree.xsl") is shown further below. 
(Essentially, one (#1) has an extra "Text" node).
	
http://www.cranesoftwrights.com/resources/showtree/showtree-20000610.xsl

- DOES IT WORK?
The difference in getting results to process through
<xsl:apply-templates> and 
<xsl:copy-of> is that:
	- GOOD: one works! (the one _with_ the space (#1)), 
	- NOT GOOD: and the other does _not_! (#2)(I get "empty node
list" - both Xalan and Saxon).


- RTF vs. NODESET (???)
>> But there's something about the XSLT processor's behavior with
"Result Tree 
Fragments" (RTF) ((#1) the one _with_ the space) vs. "nodesets" ((#2)
the one 
without (I think )) that I  fail to grasp, and which I'd like to have a
little 
better understanding of.


CONTEXT: This e-mail is follow-on to my earlier, which has more context.
	  It also has the XML & XSLT code SNIPPETS:
	
http://www.biglist.com/lists/xsl-list/archives/200304/msg01075.html
	PROBLEM DESCRIPTION...
	- I'm building up an xsl:variable (Result Tree Fragment (RTF)), 
		- by means of doing a simple 'document()' lookup, 
			- running an 'xsl:for-each' selection over in
the lookup file, 
				- and then an 'xsl:copy-of' (or
xsl:apply-templates) to my result file of 
				the selected content I want from over
there: 
					- namely, what's between one set
of the <markup> tags.



HEAD BANGING, or, HOW ABOUT A DIFFERENT XML MODEL?
To try to break out of this problem, I've tried modelling the <img>
information a couple 
of different ways (and creating appropriate templates to process):

CODE:	<markup><image><filename>pic.gif</filename><alternative>Describe
image with this text</alternative></image></markup>
CODE:	<markup><image filename="pic.gif"><alternative>Describe image
with this text</alternative></image></markup>
CODE:	<markup><image filename="pic.gif">Describe image with this
text</image></markup>

>> Alas, same issue every time: if I don't insert a space between
elements, I still 
get no results.
If I do insert a single space, I get everything I need.  

(You'd think by now I'd have given up 8>) 


Thanks again for any insights anyone can offer.
William Reilly
wreilly@xxxxxxxxxxx
Boston, Massachusetts U.S.A.



==================
1. YES. DOES WORK (xsl:copy-of or xsl:apply-templates can be made to
work)

			+++++++++++++++++++++++++++++++++++++++++++
CODE #1:		<markup> <img src="pic.gif"/></markup>       <<
RTF
			+++++++++++++++++++++++++++++++++++++++++++
		
	Discussion: YES, there's whitespace: a single space (that's all
you need to 
	turn this into a Result Tree Fragment (RTF) apparently!)

	Question: Now that it's an RTF, what is it about RTFs that the
<xsl:apply-templates/> 
	_does_ get the <xsl:template match="img"> to process
successfully??

--- showtree --- SEE ITEM 18 --------
2.4.4.2.17  Text (msgs-file,msgs,msg,segment): {
			}
2.4.4.2.18  Element 'markup' (msgs-file,msgs,msg,segment): 
2.4.4.2.18.1  Text (msgs-file,msgs,msg,segment,markup): { }
2.4.4.2.18.2  Element 'img' (msgs-file,msgs,msg,segment,markup): 
2.4.4.2.18.2.A  Attribute 'src': {pic.gif}
2.4.4.2.19  Text (msgs-file,msgs,msg,segment): { 
}
------------------------


==================
2. NO. DOES _NOT_ WORK (xsl:copy-of or xsl:apply-templates can NOT be
made to 
			work -- it's an EMPTY NODE LIST)

			+++++++++++++++++++++++++++++++++++++++++++
CODE #2:		<markup><img src="pic.gif"/></markup>
<< nodeset (I believe(?))
			+++++++++++++++++++++++++++++++++++++++++++
		
	Discussion: NO whitespace. EMPTY element content only.

	Question: Is this a "nodeset" (as opposed to Result Tree
Fragment (RTF))?

>>	KEY QUESTION: Whatever it is, why doesn't <xsl:apply-templates/>
get the template 
					I have for <xsl:template
match="img"> to get processed??

--- showtree --- SEE ITEM 12 --------
2.4.6.2.11  Text (msgs-file,msgs,msg,segment): {
				}
2.4.6.2.12  Element 'markup' (msgs-file,msgs,msg,segment): 
2.4.6.2.12.1  Element 'img' (msgs-file,msgs,msg,segment,markup): 
2.4.6.2.12.1.A  Attribute 'src': {pic.gif}
2.4.6.2.13  Text (msgs-file,msgs,msg,segment): {
}
------------------------

++++  /END of e-mail ++++++++++++++++++++++++++++++++++++++++++++++++++



--- ORIGINAL E-Mail ---------------------------

Date: Tue, 22 Apr 2003 22:10:48 -0400
From: "William Reilly" <wreilly@xxxxxxxxxxx>
Subject:  xsl:copy-of O.K. on RTF, but nothing on <EMPTY/> element
content (?)

Greetings.

With this e-mail I'm looking to confirm if I am barking up the wrong
tree.

Can this be done?  Ought I to be trying a different approach?  
Maybe to modelling my XML (?), maybe to programming my XSLT (??)

Thank you for any help or clarification that can be offered. William
Reilly wreilly@xxxxxxxxxxx Boston, Massachusetts U.S.A. ===============

Below are 3 snippets:
- - XML Main Data File
- - XML Lookup File
- - XSLT That Does document() Lookup

PROBLEM DESCRIPTION...

- - I'm building up an xsl:variable (Result Tree Fragment (RTF)), 
	- by means of doing a simple 'document()' lookup, 
		- running an 'xsl:for-each' selection over in the lookup
file, 
			- and then an 'xsl:copy-of' to my result file of
the selected content I want from over there: 
				- (namely, what's between one set of the
<markup> tags. Pls. see below).
				
++ CASE # 1  (WORKING FINE)
	Here, what's found is a RTF: <markup>'s content can have either
Mixed Content, 
	or be simply #PCDATA.
	'xsl:copy-of' copies it all over, just fine.

	<markup>an <a
href="http://www.bank.com/CALIF/interest.html">Interest Maximizer
account</a>.</markup>


++ CASE # 2  (NOT WORKING)
	Here, what's found is apparently _not_ a RTF (?), but instead a
nodeset (??).
	This content is EMPTY ELEMENT ONLY.  (Not even any whitespace.)
	At any rate, xsl:copy-of gets no result back ("empty node list")

	(tried both Xalan and Saxon). 

	<markup><img src="images/california_header.gif"/></markup>


++ CASE # 2a (This WILL Work)
	Interestingly, here, if I introduce even a single space (!)
between 
	<markup> and <img>, it then works fine (becomes Mixed Content).

	<markup> <img src="images/california_header.gif"/></markup>


- -=- A Few Words from the Recommendation...  -=-=-=-=-=-=-=-=-=
http://www.w3.org/TR/xslt#copy-of

11.3 Using Values of Variables and Parameters with xsl:copy-of

"...used to insert a result tree fragment"
"...(for) a node-set, all the nodes in the set are copied"

"The xsl:copy-of element can be used to insert a result tree fragment
into the 
result tree, without first converting it to a string as xsl:value-of
does... 
When the result of evaluating the expression is a result tree fragment,
the complete 
fragment is copied into the result tree. 
When the result is a node-set, all the nodes in the set are copied in
document 
order into the result tree; copying an element node copies the attribute
nodes, ... "
- -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

http://www.w3.org/TR/xslt#copying
7.5 Copying

"The xsl:copy element provides an easy way of copying the current node."
- -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-


=-=-  Conclusions, Thoughts, Wonderings... (?)  =-=-=-=-=-=-=-=-= Hmmmm.
I don't truly understand everything about result tree fragments and
nodesets, 
but I am puzzled why the <img src="pic.gif"/> empty element can't get
successfully 
"xsl:copy-of'd" out of its position as the only node found inside a
container element  'markup'. ? Odd, to me.  
Doesn't it say (above) in the Recommendation that "nodes in the set are
copied..." 
and "copying an element node copies the attribute nodes" ??

Aside: 
As for xsl:copy, I don't believe it fits the bill here, as I'm relying
on xsl:copy-of's "select" attribute to help me 1) pick the right
<markup> tag, then 2) copy it over right then and there.  xsl:copy seems
more suited to when you already have selected the node you want; I'm not
in that situation (to the best of my understanding (!?)).

As I say, I'd be interested to hear useful learnings on why this is not
working.  
In the meantime, I may just work on another approach to providing a
container for 
the <img> tags markup I need.

THANKS!
William Reilly
P.S. Also, for what it's worth, I just tried removing the document()
lookup from 
the equation by putting both XML files into one, and got identical
results.  
It's really an xsl:copy-of issue.



++++++++++++++++++++++++++
 3 FILE SNIPPETS
++++++++++++++++++++++++++
======================
XML Main Data File: ("lookup" is triggered on <main-msg> element)
- ----------------------
<td>some text <main-msg name="which-product"/> some more text</td>
<td><main-msg name="header-image"/></td>
- ----------------------


======================
XML Lookup File: (2 example 'msg's: which-product, and header-image)
- ----------------------
<msgs>
	<msg name="which-product">
		<segment name="CALIFORNIA">
			<markup>an <a
href="http://www.bank.com/CALIF/interest.html">Interest Maximizer
account</a>.</markup>
		</segment>
		<segment name="OREGON">
			<markup>a <a
href="http://www.bank.com/OREGON/money.html">Money Maximizer
account</a>, with no monthly fee.*</markup>
		</segment>
		<segment>
		...
		</segment>
	</msg>
	<msg name="header-image">
			<segment name="CALIFORNIA">
				<markup><img
src="images/california_header.gif"/></markup>
			</segment>
			<segment name="OREGON">
				<markup><img
src="images/oregon_header.gif"/></markup>
			</segment>
		<segment>
		...
		</segment>
	</msg>
	...
</msgs>
- ----------------------

======================
XSLT That Does document() Lookup:
- ----------------------
<xsl:param name="segment" select="CALIFORNIA"/>
...
<xsl:template match="main-msg">
	<xsl:variable name="msg-name" select="@name"/>
	<xsl:variable name="msg-fill-contents">
		<xsl:for-each
select="document($LookupFilename)//msgs/msg">
			
<!-- XSL:COPY-OF
		Works fine EXCEPT when <markup> contains EMPTY ELEMENT
ONLY content.
		e.g. <markup><img
src="images/california_header.gif"/></markup>
(Note: I tried both with and without final '/node()' step.)
	
==================================================================  -->
		<xsl:copy-of
select="segment/markup[ancestor::msg/@name=$msg-name  
					and  
	
ancestor::segment/@name=$segment]/node()"/>	
<!-- /==================================================================
-->

		</xsl:for-each>
	</xsl:variable>
		
		... (use the $msg-fill-contents variable)...

</xsl:template>
- ----------------------

++++++   /END of e-mail  +++++++++++++++++++++++++++++++++++++++++++

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list

------------------------------

End of XSL-List Digest V4 #1259
*******************************


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.