xsl-list
[Top] [All Lists]

RE: [xsl] Problem using variables with xpath

2007-04-05 11:06:47
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(_at_)saxonica(_dot_)com> 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(_at_)yahoo(_dot_)com] 
Sent: 05 April 2007 17:40
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
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[(_at_)id=$pdfdoctitle]">
modified:<xsl:for-each


select="$doc2node//doc[(_at_)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[(_at_)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



--~------------------------------------------------------------------
XSL-List info and archive: 
http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to:
http://lists.mulberrytech.com/xsl-list/
or e-mail:
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--




--~------------------------------------------------------------------
XSL-List info and archive: 
http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to:
http://lists.mulberrytech.com/xsl-list/
or e-mail:
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--





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

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--