[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

RE: [xsl] Using attributes with XPath


Subject: RE: [xsl] Using attributes with XPath
From: Mike Ferrando <mikeferrando@xxxxxxxxx>
Date: Wed, 23 Aug 2006 22:07:13 -0700 (PDT)

Jackie,
If you want to write templates for common attributes, you can
distinguish them in two ways (XSLT 1.0).

1. use the mode attributes in the xsl:apply-templates and
xsl:template. This will single out the attribute for particular
transformation for each instance. In your case it would mean a
template for the list/@type attribute and one for each other
instance. You will need to think of your tranformation in catagories
(common transformation vs. uncommon). Use a general template for the
common, and particular templates for what is not common.

<xsl:apply-templates select="@type" mode="list_parent"/>

<xsl:template match="@type" mode="list_parent">
<!-- your cool code here for a list/@type transformation -->
</xsl:template>

2. You can get fancy by using a param and a single template for a
common attribute.

<xsl:apply-templates select="@type">
  <xsl:with-param name="parent_x" select="local-name()"/>
</xsl:apply-templates>

<xsl:template match="@type">
  <xsl:param name="parent_x"/>
  <xsl:choose>
    <xsl:when test="string($parent_x)='list'">
<!-- cool code here for list/@type -->
    </xsl:when>
    <xsl:otherwise>
<!-- cool code here for all the rest -->
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>


Hope this helps.

Mike Ferrando
Library Technician
Library of Congress
Washington, DC
202-707-4454


--- Jacqueline Radebaugh <jrad@xxxxxxx> wrote:

> Hello:
> 
> Thank you very much for your help.  I revised my code so that I
> created two templates for the attributes of the <list> element.  It
> looks like:
> 
> <!-- list[parent::description] -->
> <xsl:template match="list[parent::description]">
> <fo:list-block>
>   <xsl:apply-templates/>
>  </fo:list-block>
> </xsl:template>
> 
> <xsl:template match="@type[parent::list]">
> <fo:inline  font-size="10pt" font-weight="normal"> 
> <xsl:apply-templates/>   
>   </fo:inline>
> </xsl:template>
> 
> <xsl:template match="@mark[parent::list]">
> <fo:inline  font-size="10pt" font-weight="normal"> 
> <xsl:apply-templates/>   
>   </fo:inline>
> </xsl:template>
> 
> <xsl:template match="item[parent::list]">
> <fo:list-item>
>  <fo:list-item-label>
>  <fo:block></fo:block>
>  </fo:list-item-label>
>  <fo:list-item-body>
>  <fo:block>
>  <xsl:apply-templates/>
>  </fo:block>
>  </fo:list-item-body>
>  </fo:list-item>
> </xsl:template>
> 
> I am still obtaining no output of the list.  However, when I take
> the attributes off of the <list> element in my source code, i.e., 
> 
> <list>
> <item>- The item contains more than one language one of which may
> be a sign language</item>
> <item>- The item is or includes a translation</item>
> <item>- The language of the summaries, abstracts, or accompanying
> material differs from the language of the main item</item>
> <item>- The language of a table of contents differs from the
> language of the main item</item>
> </list>
> 
> my XSLT code works.   What I am still doing wrong?  It is
> definitely related to the attributes of <list> (i.e., 
> type="marked" mark="*").
> 
> 
> Thank you very much for your help!
> 
> Best wishes,
> 
> 
> 
> 
> Jackie Radebaugh
> 
> Library of Congress
> Network Development & MARC Standards Office
> Washington, DC
> USA
> Phone:  +1-202-707-1153
> FAX:  +1-202-707-0115
> E-Mail:  jrad@xxxxxxx
> 
> 
> >>> mike@xxxxxxxxxxxx 08/22/06 4:27 PM >>>
> > 
> > <xsl:template match="list">
> > <fo:list-block>
> >   <xsl:apply-templates select="@* 
> 
> That will apply-templates to the attributes of the list element,
> but if
> you've written any template rules that match attributes, you
> haven't shown
> them to us.
> 
> 
> | *[contains(@type, 
> > $my_version) or string-length(@type)=0] | text()"/>  
> 
> That will match children of the list element that have a type
> attribute
> satisfying certain conditions, but in the XML you showed us, no
> children of
> the list element have a type attribute.
> 
> | text()"/>  
> 
> That will match text node children of the list element, but in the
> data you
> showed us, the only text node children of the list element were
> whitespace.
> 
> Michael Kay
> http://www.saxonica.com/ 
> 
> 


__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 


Current Thread
Keywords