|
Subject: A few XSL questions. From: Michel Goossens <Michel.Goossens@xxxxxxx> Date: Thu, 22 Oct 1998 13:26:25 +0100 (MET) |
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 |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re-ordering elements, Tomas Eriksson | Thread | Relation between XSL and DOM, Amit Rekhi |
| Relation between XSL and DOM, Amit Rekhi | Date | RE: Relation between XSL and DOM, Ed Nixon |
| Month |