xsl-list
[Top] [All Lists]

RE: [xsl] xml cells transformed in to a 2-d table, some table cells missing, full table required - constant variables.

2009-01-03 02:54:45
By the way, please don't get into the habit of writing:

<xsl:variable name="row">
  <xsl:value-of select="letter"/>
</xsl:variable>

when you could write

<xsl:variable name="row" select="letter"/>

I'm afraid it's a very common but very bad coding habit, and it's as well to
break it early.

It's not just that your code is more verbose than it needs to be (XSLT has a
reputation for being verbose, which coding like this only encourages). More
to the point, it can be extremely inefficient. The two constructs are not
technically equivalent: in the first case you are building a tree structure
(a "result tree fragment" in 1.0 terminology), consisting of a document node
and a text node. It's very likely that when you refer to $row, you will do
so in a context where the string value of $row is required, in which case
the string will be extracted from the result tree fragment - so why build
this tree in the first place, when all you need is the string? 

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


-----Original Message-----
From: Brendan Sleight [mailto:bms(_at_)barwap(_dot_)com] 
Sent: 03 January 2009 02:01
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] xml cells transformed in to a 2-d table, some 
table cells missing, full table required - constant variables.

Hi All,

I am having fun with XSL. I am developing an application for 
traffic signals (traffic-lights) that uses xml and the input 
and output. I want to make everything based around the xml. 
So I decided to use stylesheets when I need text output 
rather than create extra methods on the classes. Basically I 
now being stubborn and am _going_ to use stylesheets even if 
it drives me insane.

I have hit a snag as variables in XSL are constant. So I can 
not set a flag to tell me when something has not produced a output.

I am taking a basic xml file:-
  http://www.barwap.com/files/2008/Dec/30/example-site-2.xml
Basically with lots of entries such as:-
   <intergreen>
    <from>A</from>
    <to>B</to>
    <length>7</length>
   </intergreen>
   <intergreen>
    <from>A</from>
    <to>C</to>
    <length>5</length>
   </intergreen>
   <intergreen>
    <from>B</from>
    <to>A</to>
    <length>7</length>
   </intergreen>

Each of the <intergreen> are going to be used to form a 2-d 
table. So far I have got this stylesheet:-
  
http://www.barwap.com/files/2009/Jan/02/site-transform-intergreens.xsl

Normally I would use python-amara -
http://uche.ogbuji.net/tech/4suite/amara/ as my XSL 
processor, but I testing using xmlstarlet. 
http://xmlstar.sourceforge.net/, version 1.0.1-2. The 
command:- xmlstarlet tr ./site-transform-intergreens.xsl 
./example-site-2.xml

Gives:-
<?xml version="1.0"?>
<b>Intergreen table</b><tt><i>
 </i><i>  A</i><i>  B</i><i>  C</i><i>  D</i><i>  A</i><b> 7 
</b><b> 5 </b><i>  B</i><b> 7 </b><i>  C</i><b> 6 </b><i>  
D</i><b> 5 </b><b> 5 </b><b> 5 </b></tt>

Or without the <b> and <i>, A table of "from" verus "to" :-

Intergreen table
   A  B  C  D
 A 7  5
 B 7
 C 6
 D 5  5  5


However I can not find a solution where if i do not have en 
entry for say, From A to D, a cell is still added to the 
plain text table. (Long story but I can not use html tables.) 
So rather then getting a half table I get a full populated 
table, the ideal answer:-

Intergreen table
    A  B  C  D
 A 0  7  5  0
 B 7  0  0  0
 C 6  0  0  0
 D 5  5  5  0

I could pre-populate the xml file with null entires, but that 
makes the file on say a 32x32 table not very friendly for a 
human to read.

I have played around with a few options, but hit the snag 
that variables in XSL are constants so flags are out of the 
question. Also the stylesheet feel very poorly written by me, 
as I loop through all the entries of the <intergreen> tag 
until I find the tag equaling row and column, which feels 
very in-efficient.

So any tips on getting the stylesheet to the correct output 
would be very appreciated as I have hit a bit of a brick wall 
and run out of ideas. I am very new to style sheets and xml.  
Can this even be done with stylesheets ?

Best Regards,
Brendan M. Sleight

xmlstarlet tr ./processor-version.xsl ./exmaple.xml <?xml 
version="1.0"?> <html 
xmlns="http://www.w3.org/TR/xhtml1/strict";><head><title>XSLT
Processor Version</title>
</head><body><p>XSL version: 1.0
</p><p>Vendor: libxslt
</p><p>Vendor URL: http://xmlsoft.org/XSLT/ </p><p>Product 
name: [Undefined] </p><p>Product version: [Undefined] 
</p><p>Is schema-aware: [Undefined] </p><p>Supports 
serialization: [Undefined] </p><p>Supports backwards 
compatibility: [Undefined] </p></body></html>

--~------------------------------------------------------------------
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>
--~--