xsl-list
[Top] [All Lists]

RE: [xsl] <xsl:call-template> XSLT 2.0

2008-11-20 03:58:49
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(_dot_)chaturvedi(_at_)idsil(_dot_)com] 
Sent: 20 November 2008 08:36
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] <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[(_at_)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[(_at_)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[(_at_)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

==============================================================
==============
================



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--