xmlgraphics-fop-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Andreas Delmelle <andreas.delme...@telenet.be>
Subject Re: Optional XML attributes & default values
Date Fri, 13 Mar 2009 19:04:58 GMT
On 13 Mar 2009, at 17:18, u671296 wrote:

Hi

To start off, a very brief answer to this:

> With the xml & code below I get the following error (from FOP) at  
> the marked
> location:
> xsl:with-param is not allowed in this position in the stylesheet!
>

That is expected. xsl:call-template will result in nodes being created  
in the result tree. You cannot use it as a function that returns a  
value to pass to another xsl:call-template. XSLT 2.0 would offer  
xsl:function for that purpose, but before you run off upgrading the  
stylesheet...

<snip />
> My XML can contain optional attributes for tables, things like  
> border-width,
> border-style etc. I need to supply default values if the attribute  
> does not
> exist and as there could be many optional parameters I don't want to  
> use
> XSL:choose statements to cope with the variations.
>
> Instead I'm trying to use a get_params template to see what  
> parameter is in
> question, return the value of the supplied attribute else the  
> default which
> is then used in a with_params statement. The code below is a cludge  
> to try
> and get it working for one attribute (border-style) only.

Strictly speaking, off-topic for the list, but I notice you are  
missing out on a very powerful feature of XSLT, called "attribute sets".

You could easily define a set of default attributes for various types  
of formatting objects (block, table, table-cell... etc.)

Since you specify the attributes from the explicit values coming from  
your source XML directly on the literal result element or via  
xsl:attribute, those values will always take precedence over values  
that are defined in any applied attribute sets.

Create the desired attribute set as a top-level element in the  
stylesheet:

<xsl:attribute-set name="table-border-defaults">
   <xsl:attribute name="border">1pt solid black</xsl:attribute>
   ...
</xsl:attribute>

and a bit further on:
...
<fo:table ...>
    <xsl:apply-templates select="@border | @border-style" />
    ...
    <fo:table-body xsl:use-attribute-sets="table-border-defaults">
      <xsl:apply-templates select="../@border | ../@border-style" />
...

<xsl:template match="@*">
   <xsl:attribute name="name(.)"><xsl:value-of select="." /></ 
xsl:attribute>
</xsl:template>


The simple template below is probably a bit too generic, but could  
prove enough to get you started.
The point is that, if the source table-node contains a "border"  
attribute, that one will prevail on the fo:table-body. If not, then  
the one from the xsl:attribute-set is used.


Regards

Andreas

---------------------------------------------------------------------
To unsubscribe, e-mail: fop-users-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-users-help@xmlgraphics.apache.org


Mime
View raw message