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

Re: [xsl] xsl:apply-templates in combination with xsl:choose


Subject: Re: [xsl] xsl:apply-templates in combination with xsl:choose
From: Martin Honnen <Martin.Honnen@xxxxxx>
Date: Wed, 26 Aug 2009 14:12:03 +0200

Stefanie Haupt wrote:

<xsl:template match="filesystem">
.....

<xsl:choose>
 <xsl:when
test="file/document(.)/xh:html/xh:head/xh:link/attribute::rel[contains(.,'stylesheet')]">
   <xsl:apply-templates select="file" mode="neuerTest"/>
 </xsl:when>

<xsl:when
test="file/document(.)/xh:html/xh:head/xh:title[contains(.,'Mag')]">
<xsl:apply-templates select="file" mode="#default"/>
</xsl:when>
</xsl:choose>


</xsl:template>

<xsl:template match="file" mode="neuerTest">
...
<xsl:template>

<xsl:template match="file" mode="#default">
...
<xsl:template>

The problem is that the first 'when' always turns true. So all files are
processed using the first argument. I tried testing for the other type
in first place and got the same result: The test I place first is always
true even if I made sure that in the documents to be processed the
things I test for are exclusive. Type B doesn't have a stylesheet
attribute and type A never contains 'Mag' in title.


There must be a syntactical error or am I using this at the wrong place?

Well inside of an xsl:template match="filesystem" the expression
file/document(.)
gives you a sequence of document nodes of all 'file' child elements and that way


test="file/document(.)/xh:html/xh:head/xh:link/attribute::rel[contains(.,'stylesheet')]"
checks whether there is a link rel="stylesheet" element in at least one of the files referenced by all the 'file' child elements of the 'filesystem' element.


So you probably rather want e.g.

<xsl:template match="filesystem">
  <xsl:apply-templates select="file"/>
</xsl:template>

<xsl:template match="file">
<xsl:choose>
<xsl:when test="document(.)/xh:html/xh:head/xh:link/attribute::rel[contains(.,'stylesheet')]">
<xsl:apply-templates select="." mode="neuerTest"/>
</xsl:when>
<xsl:when test="document(.)/xh:html/xh:head/xh:title[contains(.,'Mag')]">
<xsl:apply-templates select="." mode="someOtherMode"/>
</xsl:when>
</xsl:choose>
</xsl:template>


<xsl:template match="file" mode="neuerMode">
 ...
</xsl:template>

<xsl:template match="file" mode="someOtherMode">
  ...
</xsl:template>
--

	Martin Honnen
	http://msmvps.com/blogs/martin_honnen/


Current Thread