xsl-list
[Top] [All Lists]

RE: [xsl] Needing suggestions for better XSL logic

2006-10-26 07:09:40
The stylesheet uses XSLT 2.0 constructs so you will need to run it on a 2.0
processor.

When you do so, note the spelling codepoints-to-string(.)

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

-----Original Message-----
From: Kevin(_dot_)Weiss(_at_)dot(_dot_)gov 
[mailto:Kevin(_dot_)Weiss(_at_)dot(_dot_)gov] 
Sent: 26 October 2006 14:55
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: RE: [xsl] Needing suggestions for better XSL logic

Thanks for the replies! Unfortunately, I'm still having 
problems. I tried applying a simple version of Mr. Gandhi's 
stylesheet that should print just the ANSI characters:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
      xmlns:xs="http://www.w3.org/2001/XMLSchema";>
<xsl:output method="html" encoding="UTF-8" /> <xsl:template 
match="/resultset"> <html> <body>
      <xsl:for-each select="65 to 90">
              <xsl:variable name="letter"
select="code-points-to-string(.)" />
              <p><xsl:value-of select="$letter" /></p> 
      </xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

I receive the following error:

      Expected token 'eof' found 'NAME'. 65 -->to <--90

I can't find much of anything on the web about this error. 
I'm testing this by opening the XML file in IE6 (the file 
links to the stylesheet with <?xml-stylesheet type="text/xsl" 
href="glossary.xsl"?>). Any help is appreciated. Thanks again!

Kevin Weiss


-----Original Message-----
From: Mukul Gandhi [mailto:gandhi(_dot_)mukul(_at_)gmail(_dot_)com]
Sent: Wednesday, October 25, 2006 1:21 PM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] Needing suggestions for better XSL logic

(Learning from David's answer), I suggest the following XSLT 2.0
stylesheet:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
                       xmlns:xs="http://www.w3.org/2001/XMLSchema";
                       xmlns:my="http://dummy";
                       version="2.0">

<xsl:output method="html"/>

<xsl:template match="/resultset">
  <xsl:variable name="here" select="." />
  <html>
   <head>
     <title/>
   </head>
   <body>
     <xsl:for-each select="65 to 90">
       <xsl:variable name="letter" select="codepoints-to-string(.)"/>
       <p><xsl:value-of select="$letter" /></p>
       <xsl:variable name="htmlFragment"
select="my:getHtmlFragment($letter, $here)" />
       <xsl:copy-of select="$htmlFragment" />
     </xsl:for-each>
   </body>
 </html>
</xsl:template>

<xsl:function name="my:getHtmlFragment" as="node()*">
  <xsl:param name="letter" as="xs:string"/>
  <xsl:param name="here" as="element()"/>

  <ul>
    <xsl:for-each select="$here/term[starts-with(termname, 
$letter) or starts-with(termname, lower-case($letter))]">
      <li><xsl:value-of select="termname" /> (<xsl:value-of 
select="termattrs/termdef" />)</li>
    </xsl:for-each>
  </ul>
</xsl:function>

</xsl:stylesheet>


On 10/25/06, Kevin(_dot_)Weiss(_at_)dot(_dot_)gov 
<Kevin(_dot_)Weiss(_at_)dot(_dot_)gov> wrote:
Hi all,

I'm trying to find a better alternative to our current test XSL 
template. Currently, we have the following XML file structure 
(extremely simplified from the original):

<resultset>
   <term>
       <termname>First Term</termname>
       <termattrs>
           <termdef>This is the firstterm description.</termdef>
       </termattrs>
   </term>
   <term>
       <termname>Second Term</termname>
       <termattrs>
           <termdef>This is the second term description.</termdef>
       </termattrs>
   </term>
</resultset>

We're trying build a glossary of the terms listed in alphabetical
order.
In other words, after the translation, viewing the XML (in 
IE) should 
produce an output similar to the following:

A
B
...
F
First Term (This is the first term description.) ...
S
Second Term (This is the second term description.) ...
Z

Unfortunately, our current XSL logic involves an 
<xsl:for-each> loop 
which tests whether the first letter of <termname> begins with a
letter.
However, this is done for *each* letter, so we have duplicate code,
i.e.:

<xsl:stylesheet version="2.0"
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
...
<p>A</p>
<xsl:template match="/resultset">
   <xsl:for-each select="term">
       <xsl:if test="starts-with(termname, 'A') or
           starts-with(termname, 'a')">
           <xsl:value-of select="termname" />
           <xsl:value-of select="termattrs/termdef" />
       </xsl:if>
   </xsl:for-each>

<p>B</p>
<xsl:template match="/resultset">
   <xsl:for-each select="term">
       <xsl:if test="starts-with(termname, 'B') or
           starts-with(termname, 'b')">
           <xsl:value-of select="termname" />
           <xsl:value-of select="termattrs/termdef" />
       </xsl:if>
   </xsl:for-each>
...
</xsl:template>
</xsl:stylesheet>

Is there a better method than using multiple <xsl:for-each> loops? 
We've looked into other options (e.g. xsl:for-each-group, using 
multiple apply-templates), but nothing produces our desired 
output. My

brain is mush right now, so any suggestions are greatly 
appreciated. 
If there's anything else you need from me, please let me 
know. Thanks
in advance!

Kevin Weiss


--
Regards,
Mukul Gandhi

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



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