Subject: RE: <xsl:call-template> XSLT 2.0
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Thu, 20 Nov 2008 08:58:16 -0000
|
In xsl:choose, the branches are mutially exclusive - only one will be
executed. I think you need to replace
<xsl:choose>
<xsl:when test="A">X</xsl:when>
<xsl:when test="B">Y</xsl:when>
<xsl:when test="C">Z</xsl:when>
</xsl:choose>
by
<xsl:if test="A">X</xsl:when>
<xsl:if test="B">Y</xsl:when>
<xsl:if test="C">Z</xsl:when>
Michael Kay
http://www.saxonica.com/
> -----Original Message-----
> From: Pankaj Chaturvedi [mailto:pankaj.chaturvedi@xxxxxxxxx]
> Sent: 20 November 2008 08:36
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: <xsl:call-template> XSLT 2.0
>
>
> Hi all,
>
> I have an xml structure looks like below:
>
> XML Snippet
> ============
>
> <?xml version="1.0" encoding="UTF-8"?>
> <article>
> <meta>
> <production-dates printpubdate="2009" receiveddate="30Sep2008"
> reviseddate="30Sep2008" acceptdate="30Oct2008"/> </meta>
> <abstract>This is an abstract</abstract> </article>
>
>
> I've defined a template for <production-dates> attributes,
> which is like
> this:
>
>
> Stylesheet Snippet
> ===================
>
>
> <?xml version="1.0" encoding="UTF-8"?>
> <xsl:stylesheet version="2.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
>
> <!-- For Production-Dates -->
> <xsl:variable name="months" as="element()+">
> <month name="Jan" num="January"/>
> <month name="Feb" num="Febuary"/>
> <month name="Mar" num="March"/>
> <month name="Apr" num="April"/>
> <month name="May" num="May"/>
> <month name="Jun" num="June"/>
> <month name="Jul" num="July"/>
> <month name="Aug" num="August"/>
> <month name="Sep" num="September"/>
> <month name="Oct" num="October"/>
> <month name="Nov" num="November"/>
> <month name="Dec" num="December"/>
> <month name="xxx" num="Xxx"/>
> <month name="Xxx" num="Xxx"/>
> </xsl:variable>
>
>
> <xsl:template name="production_dates">
> <xsl:text>(</xsl:text>
> <xsl:choose>
>
> <!-- Received date -->
>
> <xsl:when test="//production-dates/@receiveddate">
> <xsl:text>Received </xsl:text>
> <xsl:for-each
> select="//production-dates/@receiveddate">
> <xsl:variable name="re" select="
> '^([0-9a-z]{2})?([A-Za-z][a-z][a-z])([0-9]{4})$'"/>
> <xsl:analyze-string select="."
> regex="{ $re }">
> <xsl:matching-substring>
> <xsl:variable name="day"
> select="regex-group(1)"/>
> <xsl:sequence select="
> concat(regex-group(1), ' ',
> $months[@name eq
> regex-group(2)]/@num, ' ', regex-group(3))"/>
> </xsl:matching-substring>
> </xsl:analyze-string>
> </xsl:for-each>
> </xsl:when>
>
>
> <!-- Revised date -->
> <xsl:when test="//production-dates/@reviseddate">
> <xsl:text>; final version received </xsl:text>
> <xsl:for-each
> select="//production-dates/@reviseddate">
> <xsl:variable name="re" select="
> '^([0-9a-z]{2})?([A-Za-z][a-z][a-z])([0-9]{4})$'"/>
> <xsl:analyze-string select="."
> regex="{ $re }">
> <xsl:matching-substring>
> <xsl:variable name="day"
> select="regex-group(1)"/>
> <xsl:sequence select="
> concat(regex-group(1), ' ',
> $months[@name eq
> regex-group(2)]/@num, ' ', regex-group(3))"/>
> </xsl:matching-substring>
> </xsl:analyze-string>
> </xsl:for-each>
> </xsl:when>
>
> <!-- Accepted date -->
>
> <xsl:when test="//production-dates/@acceptdate">
> <xsl:text>; final version accepted </xsl:text>
> <xsl:for-each
> select="//production-dates/@acceptdate">
> <xsl:variable name="re" select="
> '^([0-9a-z]{2})?([A-Za-z][a-z][a-z])([0-9]{4})$'"/>
> <xsl:analyze-string select="."
> regex="{ $re }">
> <xsl:matching-substring>
> <xsl:variable name="day"
> select="regex-group(1)"/>
> <xsl:sequence select="
> concat(regex-group(1), ' ',
> $months[@name eq
> regex-group(2)]/@num, ' ', regex-group(3))"/>
> </xsl:matching-substring>
> </xsl:analyze-string>
> </xsl:for-each>
> </xsl:when>
> </xsl:choose>
>
> <xsl:text>)</xsl:text>
> </xsl:template>
>
> <xsl:template match="article/abstract">
> <output>
> <xsl:call-template name="production_dates"/> </output>
> </xsl:template> </xsl:stylesheet>
>
>
> Output
> =======
> <output>(Received 30 September 2008)</output>
>
>
> But the desired output is:
>
> (Received 30 September 2008; final version received 30
> September 2008; final version accepted 30 October 2008)
>
> I've noticed that problem with my <xsl:choose><xsl:when>
> conditions in which it does not reach to the next <xsl:when>
> conditions. And which are true in this case. (If I remove
> <xsl:choose> all seems to work well).
>
> Is there any problem in my defining <xsl:for-each
> select="//production-dates/@receiveddate"> "select" attribute
> or there anything else I am missing. I am using Altova XMLSpy
> XSLT 2.0.
>
> Any suggestions in this regard will be highly appreciated.
>
>
> Best,
>
> Pankaj Chaturvedi
>
> ==============================================================
> ==============
> ================
|