[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

A few XSL questions.

Subject: A few XSL questions.
From: Michel Goossens <Michel.Goossens@xxxxxxx>
Date: Thu, 22 Oct 1998 13:26:25 +0100 (MET)
xsl questions
Below there are three questions regarding XSL syntax (or my lack of
understanding of it). It would be nice if somebody could explain whether
what I want to do is feasible, possible, or not foreseen in the current
implementations/draft (I use J.Clark's xt). Many thanks. Michel Goossens

Question 1: how to get at the parent node in a pattern?

Suppose I have in my DTD something like:

<!ENTITY % sect          "stitle, (%likepara;)* ">
<!ELEMENT stitle         (#PCDATA)>
<!ELEMENT chapter        (%sect;, section*)> 
<!ELEMENT section        (%sect;, subsection*)>
<!ELEMENT subsection     (%sect;, subsubsection*)>
etc.

Now I would like to make a generic template that generates
a title for each sect element type, but calls a different
title routine (e.g., in LaTeX). 

I can of course go:

<xsl:template match="chapter/stitle">
  <xsl:text>\chapter{</xsl:text>
    <xsl:process-children/>
  <xsl:text>}{</xsl:text>
</xsl:template>
<xsl:template match="section/stitle">
  <xsl:text>\section{</xsl:text>
    <xsl:process-children/>
  <xsl:text>}{</xsl:text>
</xsl:template>
<xsl:template match="subsection/stitle">
  <xsl:text>\subsection{</xsl:text>
    <xsl:process-children/>
  <xsl:text>}{</xsl:text>
</xsl:template>
...

but i'd rather do something more generic, like

<xsl:template match="stitle">
 <xsl:choose>
   <xsl:when  test="..[chapter]">
     <xsl:text>\chapter{</xsl:text>
   </xsl:when>
   <xsl:when  test="..[section]">
     <xsl:text>\section{</xsl:text>
   </xsl:when>
   <xsl:when  test="..[subsection]">
     <xsl:text>\subsection{</xsl:text>
   </xsl:when>
   ...
  </xsl:choose>
  <xsl:process-children/>
  <xsl:text>}
  </xsl:text>
</xsl:template>

However, this syntax, although "inspired" by the
example for <xsl:if test=.[not-last-of-type()]"...
in section 2.7.10.1 of the XSL draft (June 19th edition)
does not work. How can I get the name of the parent in a pattern?

What would be _really_ cool is when I could just put the parent's element
type (say it is XXX, where XXX is chapter, section,...)
Then I could write
<xsl:template match="stitle">
<xsl:text>\</xsl:text> element_type(..)
<xsl:text>{</xsl:text>
  <xsl:process-children/>}
<xsl:text>}</xsl:text>
</xsl:template>

where element_type(..) would generate the name of the element type
of the parent.

Question 2: looping over attributes
===========

Suppose I have something like:

<includegraphics width="12cm" scale=".25" name="myfig.eps">

and I would like to obtain (in a more or less "generic" way)

\includegraphics[width=12cm, scale=.25]{myfig.eps}

where there are many more attributes possible. 
Now I explicitly enumerate all attributes and get their value "by hand".
If I had a function which could loop over all attributes for a
given element, and return the attribute name and its value, such
programming could be simplified.

This is what I do now. The attributes can be specified in any order .
I did not yet find a way to get rid of the dangling comma, which I need
as a separator in my output format. 

<xsl:template match="includegraphics">
<xsl:text>\includegraphics[</xsl:text>
<xsl:if test="attribute(width)"><xsl:text>width=</xsl:text>
    <xsl:value-of expr="attribute(width)"/><xsl:text>, </xsl:text></xsl:if>
<xsl:if test="attribute(height)"><xsl:text>height=</xsl:text>
    <xsl:value-of expr="attribute(height)"/><xsl:text>, </xsl:text></xsl:if>
<xsl:if test="attribute(bb)"><xsl:text>bb="</xsl:text>
    <xsl:value-of expr="attribute(bb)"/><xsl:text>, </xsl:text></xsl:if>
<xsl:if test="attribute(angle)"><xsl:text>angle=</xsl:text>
    <xsl:value-of expr="attribute(angle)"/><xsl:text>, </xsl:text></xsl:if>
<xsl:if test="attribute(scale)"><xsl:text>scale=</xsl:text>
   <xsl:value-of expr="attribute(scale)"/><xsl:text>, </xsl:text></xsl:if>
<xsl:text>]{</xsl:text><xsl:value-of expr="attribute(name)"/>}<xsl:text>
</xsl:text>
</xsl:template>

It would be nicer is there were something like:
<xsl:template match="includegraphics">
<xsl:text>\includegraphics[</xsl:text>
<xsl:foreach select="(attributes[.])">

do something according to the name:
.... attribute_name()=attribute_value() ...

<xsl:text>{</xsl:text><xsl:value-of expr="attribute(name)"/>}<xsl:text>}
</xsl:text>
</xsl:template>


Question 3: Getting at the name of the matched element.
===========

I would like to know the exact name of the element which matched (noted
XXXX in the example below, where XXXX=a1, a2, or a3, depending on which of
them occurred in the XML source), e.g.,

<xsl:template match="a1|a2|a3">
<xsl:text>
\begin{XXXX}
</xsl:text>
  <xsl:process-children/>
<xsl:text>
\end{XXXX}
</xsl:text>
</xsl:template>

So, if I have:
... <a1>some text</a1>..
Then I would like this to be transformed into
... \begin{a1}some text\end{a1} (and similarly for a2 and a3).
This would make a lot of the code a lot shorter.


+-------------------------------------------------------------+
| Dr. Michel Goossens          Phone: (+41 22) 767-5028 (NEW) |
| IT Division                  Fax  : (+41 22) 767-8630       |
| CH-1211 Geneva 23            Email: michel.goossens@xxxxxxx |
| Switzerland                                                 |
+-------------------------------------------------------------+


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.