RE: [xsl] Problem using variables with xpath

Subject: RE: [xsl] Problem using variables with xpath
From: Raghavan <raghavan479@xxxxxxxxx>
Date: Thu, 5 Apr 2007 11:06:25 -0700 (PDT)
Thanks for the quick response Mike.

[mike]:what are the symptoms? Does it say "I am unable
to do this string compare",or what?
[raghav]:There are no warnings or errors. I just dont
see the text extracted from the title attr inside that
block
 
--- Michael Kay <mike@xxxxxxxxxxxx> wrote:

> >the same piece of XSL is unable to do that string
> compare
> 
> what are the symptoms? Does it say "I am unable to
> do this string compare",
> or what? 
> 
> >   <xsl:variable name="pdfdoctitle">
> >      <xsl:value-of select="//Document/@url"/>
> >   </xsl:variable>
> 
> Don't do this, it's very inefficient and sometimes
> means something different
> from what you intended.
> 
> Do:
> 
> <xsl:variable name="pdfdoctitle"
> select="//Document/@url"/>
> 
> Michael Kay
> http://www.saxonica.com/
> 
> > -----Original Message-----
> > From: Raghavan [mailto:raghavan479@xxxxxxxxx] 
> > Sent: 05 April 2007 17:40
> > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> > Subject: [xsl] Problem using variables with xpath
> > 
> > Apologize for the long mail
> > 
> > Am quite new to XSL and I am running into a
> strange problem.
> > 
> > I have 2 xml files
> > 1) input.xml 2) metadata.xml
> > The xsl is applied on input.xml. The xsl extracts
> the data 
> > corresponding to "url" attribute. This value is
> looked up 
> > (using xpath) on the second xml
> > (metadata.xml) and extract the necessary values
> from metadaat.xml
> > 
> > I've attached the necessary source files. I
> constructed the 
> > xsl using Stylus Studio (also tried
> > XMLspy) and xsl works as expected. Then I have
> this simple 
> > Java code that performs XSL transformation and the
> same piece 
> > of XSL is unable to do that string compare
> > 
> > Note: 
> > During my unit testing
> > I replaced the following line with a static text
> and the 
> > transformation worked as expected
> original:<xsl:for-each 
> > select="$doc2node//doc[@id=$pdfdoctitle]">
> > modified:<xsl:for-each
> >
>
select="$doc2node//doc[@id='http://www.something.com/path1/Doc
> > ument1.pdf']">
> > 
> > Since am new to XSL, am not sure if we can use
> variables in 
> > XPath in first place!!!
> > 
> > Thanks,
> > -Raghav
> > 
> >
>
--------------------------------------------------------------
> > ---------------------------
> > Input XML
> >
>
--------------------------------------------------------------
> > ---------------------------
> > <?xml version="1.0" encoding="UTF-8"?>
> > <Content>
> >  <Document Type="Web"
> >
> url="http://www.something.com/path1/Document1.pdf"/>
> > </Content>
> > 
> >
>
--------------------------------------------------------------
> > ---------------------------
> > My XSL
> >
>
--------------------------------------------------------------
> > ---------------------------
> > <?xml version='1.0' encoding='utf-8'?>
> > <xsl:stylesheet version="1.0"
> > xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
> > <xsl:output method="html"/>
> > <xsl:template match="/Content">
> >     
> >   <xsl:variable name="pdfdoctitle">
> >      <xsl:value-of select="//Document/@url"/>
> >   </xsl:variable>
> >   
> >   <xsl:variable name="doc2node"
> > select="document('metadata.xml')"/>
> >   <html><head></head><body>
> > 			<p>
> >                         <!-- String compare
> scenatio 1
> > -->
> > 				<rr>
> > 				  <xsl:for-each select="$doc2node//doc">
> > 				    <xsl:if test="@id=$pdfdoctitle">
> > 					  <xsl:value-of 
> > select="@title" />
> > 					</xsl:if>
> > 				   </xsl:for-each>
> > 				</rr>
> >                        <!-- String compare
> scenatio 2
> > -->
> > 				<rr2>
> > 				<xsl:for-each
> > select="$doc2node//doc[@id=$pdfdoctitle]">
> > 					<xsl:value-of select="@title"/>
> > 				</xsl:for-each>
> > 				<rr2>
> >                        <!-- Display value of
> pdfdoctitle -->
> > 				<rr3>
> > 				  <xsl:value-of select="$pdfdoctitle"/>
> > 				</rr3>
> > 
> > 			</p>
> >  </body></html>
> > </xsl:template>
> > </xsl:stylesheet>
> > 
> >
>
--------------------------------------------------------------
> > ---------------------------
> > metadata.xml file used in the XSL
> >
>
--------------------------------------------------------------
> > ---------------------------
> > <?xml version="1.0" encoding="UTF-8"?>
> > <documents>
> >     <doc id="x" title="title for document x"
> > issuedate="12-Aug-2005" issuenumber="1" />
> >     <doc id="z" title="This is document z title"
> > issuedate="1-Jan-2006" issuenumber="2" />
> >     <doc id="y" title="This is document y title"
> > issuedate="10-Aug-2006" issuenumber="2" />
> >     <doc
> > id="http://www.something.com/path1/Document1.pdf";
> > title="Title for something document"
> > issuedate="10-Aug-2005" issuenumber="22" />
> </documents>
> > 
> >
>
--------------------------------------------------------------
> > ---------------------------
> > Transform.java
> >
>
--------------------------------------------------------------
> > ---------------------------
> > import javax.xml.transform.Source;
> > import javax.xml.transform.Transformer;
> > import javax.xml.transform.TransformerFactory;
> > import javax.xml.transform.stream.StreamSource;
> > import javax.xml.transform.stream.StreamResult;
> > import java.io.*;
> > 
> > public class Transform {
> > 
> >     /**
> >      * Performs an XSLT transformation, sending
> the results
> >      * to System.out.
> >      */
> >     public static void main(String[] args) throws
> Exception {
> >         if (args.length != 2) {
> >             System.err.println(
> >                 "Usage: java Transform [xmlfile]
> [xsltfile]");
> >             System.exit(1);
> >         }
> > 
> >         File xmlFile = new File(args[0]);
> >         File xsltFile = new File(args[1]);
> > 
> >         // JAXP reads data using the Source
> interface
> >         Source xmlSource = new
> StreamSource(xmlFile);
> >         Source xsltSource = new
> > StreamSource(xsltFile);
> > 
> >         // the factory pattern supports different
> XSLT processors
> >         TransformerFactory transFact =
> >                 TransformerFactory.newInstance();
> >         Transformer trans =
> > transFact.newTransformer(xsltSource);
> > 
> >         trans.transform(xmlSource, new
> > StreamResult(System.out));
> >     }
> > }
> > 
> > 
> >  
> >
>
______________________________________________________________
> > ______________________
> > Don't get soaked.  Take a quick peek at the
> forecast with the 
> > Yahoo! Search weather shortcut.
> >
> http://tools.search.yahoo.com/shortcuts/#loc_weather
> 
> 



 
____________________________________________________________________________________
No need to miss a message. Get email on-the-go 
with Yahoo! Mail for Mobile. Get started.
http://mobile.yahoo.com/mail 

Current Thread