在XSLT中使用函数还是使用模板?

在XSLT中使用函数还是使用模板?,xslt,xslt-2.0,Xslt,Xslt 2.0,XSLT中函数与模板的优缺点是什么 我想发送一个unix时间戳,然后得到一个类似“今天”、“明天”或“下周”的答案。哪种方法最适合这种情况?在这种情况下,外部函数最适合 XSLT最适合于模式匹配和转换,而不是计算。选择而不是命名模板的主要原因是函数的可组合性要高得多 编写生成所需结果的非常简单方便: <xsl:function name="my:when" as="xs:string"> <xsl:param name="pDateTime" as="xs:dateTim

XSLT中函数与模板的优缺点是什么


我想发送一个unix时间戳,然后得到一个类似“今天”、“明天”或“下周”的答案。哪种方法最适合这种情况?

在这种情况下,外部函数最适合


XSLT最适合于模式匹配和转换,而不是计算。

选择
而不是命名模板的主要原因是函数的可组合性要高得多

编写生成所需结果的
非常简单方便:

 <xsl:function name="my:when" as="xs:string">
  <xsl:param name="pDateTime" as="xs:dateTime"/>

  <xsl:sequence select=
  "for $vToday in xs:dateTime(current-date()),
       $vTomorrow in $vToday
                    + xs:dayTimeDuration('P1D'),
       $vDayAfterTomorrow in $vTomorrow
                    + xs:dayTimeDuration('P1D'),
       $vNextWeek in $vToday
                    + 7* xs:dayTimeDuration('P1D'),
       $vNextFortnight in $vNextWeek
                    + 7* xs:dayTimeDuration('P1D')

       return
         if($pDateTime lt $vToday)
           then 'in the Past'
           else if($pDateTime lt $vTomorrow)
             then 'Today'
             else if($pDateTime lt $vDayAfterTomorrow)
              then 'Tomorrow'
             else if($pDateTime lt $vNextWeek)
              then 'This week'
             else if($pDateTime lt $vNextFortnight)
              then 'Next week'
              else 'In the Future'
  "/>
 </xsl:function>
<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xmlns:my="my:my">
 <xsl:output omit-xml-declaration="yes"/>

 <xsl:template match="/">
  <xsl:sequence select="my:when(current-dateTime())"/>,
  <xsl:sequence select="my:when(current-dateTime()
                               +xs:dayTimeDuration('P1D'))"/>,
  <xsl:sequence select="my:when(current-dateTime()
                               +xs:dayTimeDuration('P2D'))"/>,
  <xsl:sequence select="my:when(current-dateTime()
                               +xs:dayTimeDuration('P3D'))"/>,
  <xsl:sequence select="my:when(current-dateTime()
                               +xs:dayTimeDuration('P4D'))"/>,
  <xsl:sequence select="my:when(current-dateTime()
                               +xs:dayTimeDuration('P5D'))"/>,
  <xsl:sequence select="my:when(current-dateTime()
                               +xs:dayTimeDuration('P6D'))"/>,
  <xsl:sequence select="my:when(current-dateTime()
                               +xs:dayTimeDuration('P7D'))"/>,
  <xsl:sequence select="my:when(current-dateTime()
                               +xs:dayTimeDuration('P8D'))"/>,
  <xsl:sequence select="my:when(current-dateTime()
                               +xs:dayTimeDuration('P9D'))"/>
 </xsl:template>

 <xsl:function name="my:when" as="xs:string">
  <xsl:param name="pDateTime" as="xs:dateTime"/>

  <xsl:sequence select=
  "for $vToday in xs:dateTime(current-date()),
       $vTomorrow in $vToday
                    + xs:dayTimeDuration('P1D'),
       $vDayAfterTomorrow in $vTomorrow
                    + xs:dayTimeDuration('P1D'),
       $vNextWeek in $vToday
                    + 7* xs:dayTimeDuration('P1D'),
       $vNextFortnight in $vNextWeek
                    + 7* xs:dayTimeDuration('P1D')

       return
         if($pDateTime lt $vToday)
           then 'in the Past'
           else if($pDateTime lt $vTomorrow)
             then 'Today'
             else if($pDateTime lt $vDayAfterTomorrow)
              then 'Tomorrow'
             else if($pDateTime lt $vNextWeek)
              then 'This week'
             else if($pDateTime lt $vNextFortnight)
              then 'Next week'
              else 'In the Future'
  "/>
 </xsl:function>
</xsl:stylesheet>
  Today,
  Tomorrow,
  This week,
  This week,
  This week,
  This week,
  This week,
  Next week,
  Next week,
  Next week

您是否使用XSLT1.0或2.0,或者如果使用XSLT1.0,您会想到什么样的函数?好问题,+1。请参阅我的答案,以了解
@kristofer Nolgren提供的完整而简单的解决方案-它们是专门选择的函数,由XSLT处理器实现,因此非常有效。您可以使用XSLT编写任何东西,因为它是图灵完成的,但它不会很漂亮、简单或高效。这样的答案是没有根据的。编写一个简单的
来计算想要的结果是非常简单、自然和方便的。@Oded:您可能有兴趣了解XPath 2.0和XSLT 2.0,这样您对XSLT及其适用性的理解就会提高。@Dimitre-fair point。。。我承认我陷入了XSLT1.0。。。关于好书/网站,你有什么建议吗?@Oded:我推荐Michael Kay的两本关于XSLT2.0/XPath 2.0的书——它们列在这里:+1个好答案。但是这缺少了在模板上选择
xsl:function
的理由。@Alejandro:是的,我认为这是显而易见的。:)现在我编辑了我的答案,它的第一句话解释了最紧迫的原因。编辑得很好!请记住,大多数人没有得到声明性的范例(甚至一个伟大的XSLT开发人员拒绝考虑XSLT作为函数语言),所以关于函数理论(组成,HOF,尾部递归)的基本概念还不太清楚。