xsl-list
[Top] [All Lists]

[xsl] Solution: for Recursively merge (aggregate) and traverse DOM trees (XML files)

2006-06-24 21:39:29
Thanks Michael Kay! Your suggestion worked. And the
"<?xml versionfiltered="1.0".... part must have crept
in while I was copy pasting it thru openoffice writer!

For anybody that might be interested, here is the XSLT
that works for my example.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
xmlns:fo="http://www.w3.org/1999/XSL/Format";
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";
xmlns:xlink="http://www.w3.org/1999/xlink";>
        <xsl:template match="a">
                <html>
                        <head>
                                <title>Sample</title>
                        </head>
                        <body>
                                <h1>
                                        <center>
                        Sample
                </center>
                                </h1>
                                <p/>
                                <table border="2" bgcolor="yellow">
                                        <tr>
                                                <th>P</th>
                                                <th>Q</th>
                                                <th>text</th>
                                        </tr>
                                        <xsl:apply-templates/>
                                </table>
                        </body>
                </html>
        </xsl:template>

        <xsl:template match="a" mode="child">
    <xsl:apply-templates/>      
        </xsl:template>

        <xsl:template match="b">
                                        <!--xsl:for-each select="//b"-->
                                                                <xsl:choose>
                                                                        
<xsl:when test="@url">
                                                                        
<xsl:apply-templates  select="document(@url)"
mode="child"/>
                                                                        
</xsl:when>
                                                                        
<xsl:otherwise>
                                                <tr>
                                                        <td>
                                                                <xsl:value-of 
select="@p"/>
                                                        </td>
                                                        <td>
                                                                <xsl:value-of 
select="@q"/>
                                                        </td>
                                                        <td>
                                                                <xsl:value-of 
select="."/>
                                                        </td>
                                                </tr>
                                                                        
</xsl:otherwise>
                                                                </xsl:choose>   
                                        
                                        <!--/xsl:for-each-->
        </xsl:template>
        
</xsl:stylesheet>


Date: Tue, 20 Jun 2006 08:15:44 +0100
To: <xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com>
From: "Michael Kay" <mike(_at_)saxonica(_dot_)com>
Subject: RE: [xsl] Recursively merge (aggregate) and
traverse DOM trees (XML files)?
Message-ID: <005101c69439$58ad58c0$6401a8c0(_at_)turtle>

Your stylesheet needs to include within it an
instruction such as

<xsl:apply-templates select="document(@url)"/>

to dereference the links and recursively process the
referenced 
document.

I don't know what this is supposed to be:

<?xml versionfiltered="1.0" encoding="UTF-8"?>

but it isn't XML.

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

-----Original Message-----
From: Laky Tang [mailto:tulaky(_at_)yahoo(_dot_)com] 
Sent: 20 June 2006 03:46
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Recursively merge (aggregate) and
traverse DOM 
trees (XML files)?

I am trying to recursively merge a tree of XML files
and then 
apply some templates to it. I googled and also
searched this 
mailing list but did not find any help. I hope this
is 
possible using XSLT. Can somebody please point me in
the 
right direction?
 
Here is a sample of the input files and desired
output. I 
tried a sample.xsl (see below)which only goes thru
the root 
file, but need help in making it recursively go thru
all the 
linked files as well.
 
Thanks in advance,
Laky, Tang
-----------------
sample1.xml :
<?xml versionfiltered="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="sample.xsl"?>
<a> <b p 
="key1" q="2"> xxx </b> <b url = "sample2.xml"></b>
<b p 
="key10" q ="27">yyyy</b> </a>
 
sample2.xml :
<?xml versionfiltered="1.0" encoding="UTF-8"?> <a>
<b p 
="key4" q="22"> xxx2 </b> <b url =
"sample3.xml"></b> <b p 
="key7" q ="37">yyyy2</b> <b url =
"sample4.xml"></b> </a>
 
sample3.xml :
<?xml versionfiltered="1.0" encoding="UTF-8"?> <a>
<b p 
="key5" q="23"> xxx3 </b> <b p ="key6" q
="26">yyyy3</b> </a>
 
sample4.xml :
<?xml versionfiltered="1.0" encoding="UTF-8"?> <a>
<b p 
="key8" q="24"> xxx4 </b> <b p ="key9" q
="25">yyyy4</b> </a>
 
sample.xsl :
<?xml versionfiltered="1.0" encoding="UTF-8"?> 
<xsl:stylesheet versionfiltered="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
xmlns:fo="http://www.w3.org/1999/XSL/Format";
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";
xmlns:xlink="http://www.w3.org/1999/xlink";>
<xsl:template match="/">
<html>
<head>
<title>Sample</title>
</head>
<h1>
<center>
</center>
</h1>
<p/>
<xsl:for-each xml:space="default" select="param"> 
<xsl:value-of select="."/> </xsl:for-each> <table
border="2" 
bgcolor="yellow"> <tr> <th>P</th> <th>Q</th>
<th>text</th> 
</tr> <xsl:for-each select="//b"> <tr> <td>
<xsl:value-of 
select="@p"/> </td> <td> <xsl:value-of select="@q"/>
</td> 
<td> <xsl:value-of select="."/> </td> </tr>
</xsl:for-each> 
</table> </html> </xsl:template> </xsl:stylesheet>

 
Desired output (preferably as a html table):
 
P    Q    text
key1    2    xxx 
key4    22    Xxx2
key5    23    xxx3
key6    26    yyy3
Key7    37    yyy2
key8    24    xxx4
key9    25    yyy4
key10    27    yyyy


__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.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>
--~--

<Prev in Thread] Current Thread [Next in Thread>
  • [xsl] Solution: for Recursively merge (aggregate) and traverse DOM trees (XML files), Laky Tang <=