XSL中实现输入一个日期返回此日期的星期

XSL中获取星期的两种方法

输入一个日期返回此日期的星期,这个功能需用xsl中实现。

现有一个XSL模板实现了此功能,代码如下:

  1. <msxsl:script language="JScript" implements-prefix="user">
  2.     function getdate(dateNode) {
  3.         var thisDate=dateNode.nextNode().text;
  4.         var index1=thisDate.indexOf("-");
  5.         var index2=thisDate.indexOf("-",index1+1);
  6.         
  7.         var tempYear=thisDate.substring(0,index1);
  8.         var tempMon=thisDate.substring(index1+1,index2);
  9.         var tempDay=thisDate.substring(index2+1);
  10.     
  11.         var dateObj=new Date(tempYear,tempMon-1,tempDay);
  12.         var tempweekday=dateObj.getDay();
  13.         var xxx="";
  14.         switch(tempweekday){
  15.         case 0: xxx="sunday";break;
  16.         case 1: xxx="monday";break;
  17.         case 2: xxx="tuesday";break;
  18.         case 3: xxx="wednesday";break;
  19.         case 4: xxx="thursday";break;
  20.         case 5: xxx="friday";break;
  21.         case 6: xxx="saturday";break;
  22.         }
  23.     return xxx;
  24.     }
  25.     </msxsl:script>

调用:

  1. <xsl:value-of select="user:getdate('2009-10-10')"/>

但是此方法是用微软的JSCRIPT实现的,在IE下可以正常使用,而在FIREFOX下就不行了。因为JSCRIPT是MS自家的,就像HTC一样,都不被FIREFOX支持。

 

如果可以不在XSL模板中就可用JAVASCRIPT来实现:

  1. function getWeek_Zh(dateStr){   
  2.     var index1=dateStr.indexOf("-");
  3.     var index2=dateStr.indexOf("-",index1+1);
  4.     
  5.     var tempYear=dateStr.substring(0,index1);
  6.     var tempMon=dateStr.substring(index1+1,index2);
  7.     var tempDay=dateStr.substring(index2+1);
  8.     var dateObj=new Date(tempYear,tempMon-1,tempDay);
  9.     alert("----------"+dateObj);
  10.     var tempweekday=dateObj.getDay();
  11.     var xxx="";
  12.     switch(tempweekday){
  13.         case 0: xxx="sunday";break;
  14.         case 1: xxx="monday";break;
  15.         case 2: xxx="tuesday";break;
  16.         case 3: xxx="wednesday";break;
  17.         case 4: xxx="thursday";break;
  18.         case 5: xxx="friday";break;
  19.         case 6: xxx="saturday";break;
  20.     }   
  21.     return xxx;
  22.     
  23. }

由于XSL的日期函数比较缺乏,想在xsl模板中用类似new Date(),然后用getDay()的方法来实现是不可能的。一直未找到好的解决方案,昨天在优快云论坛发帖求教,终于有大大回复,并给出了完美的解决方法:

  1. <xsl:template name="getWeekDay">
  2.   <xsl:param  name="date" ></xsl:param>
  3.   <xsl:variable  name="y" select="substring-before($date,'-')" />
  4.   <xsl:variable  name="m" select="substring-before(substring-after($date,'-'),'-')" />
  5.   <xsl:variable  name="d" select="substring-after(substring-after($date,'-'),'-')" />
  6.     <xsl:variable  name="weekday" select="'一二三四五六日'" />    
  7.   <xsl:choose>
  8.    <xsl:when  test="$m = 1 or $m = 2 ">
  9.     <xsl:call-template name="getWeekDay">
  10.     <xsl:with-param  name="date" select="concat($y - 1,'-',$m+12,'-',$d)"></xsl:with-param>
  11.     </xsl:call-template>    
  12.    </xsl:when>
  13.    <xsl:otherwise>        
  14.     <xsl:variable name="weekNum" select="($d+(2*$m)+floor(3*($m+1) div 5) + $y + floor($y div 4) - floor($y div 100) + floor($y div 400)) mod 7"/>                    
  15.         星期<xsl:value-of select="substring($weekday,$weekNum+1,1)"/>
  16.     </xsl:otherwise>
  17.    </xsl:choose>
  18.  </xsl:template>

调用:

  1. <xsl:call-template name="getWeekDay">
  2.   <xsl:with-param name="date" select="$depDateOfSubSeg"/>
  3. </xsl:call-template>

在此万分感谢yiy19861

 

以上XSLT的解决方案用到了一个算法:基姆拉尔森计算公式

算法如下: 
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7

在公式中d表示日期中的日数,m表示月份数,y表示年数。

 

注意:在公式中有个与其他公式不同的地方:

把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。

<think>好的,我现在需要帮助用户解决在XSLT循环中判断某个标签是否存在的问题。首先,我得回忆一下XSLT的基本结构和相关函数。用户提到在循环中检查元素是否存在,这可能涉及到<xsl:for-each>和条件判断的结合使用。 首先,XSLT中使用<xsl:for-each>来遍历节点集,而判断元素是否存在通常可以用<xsl:if>或<xsl:choose>结合条件表达式。例如,在循环内部,可能需要检查当前节点下是否存在特定的子元素。这时候,用test属性来判断元素是否存在。比如,test="element-name"会检查当前上下文中是否存在该元素,因为如果存在的话,其布尔值为真。 接下来,我需要确认用户的具体场景。用户可能在处理XML数据时,在循环每个节点的时候,需要根据是否存在某个标签来决定显示内容。例如,在一个书籍列表中,每个book元素可能有可选的<author>标签,需要判断是否存在并显示相应的信息。 然后,我需要考虑如何正确使用XPath表达式。在XSLT的条件判断中,XPath表达式是关键。例如,使用exists()函数或者直接通过元素名称来测试是否存在。不过,需要注意的是,XSLT 1.0和2.0的语法有所不同。在1.0中,检查元素是否存在通常是通过测试节点是否存在,比如test="author",而XSLT 2.0则可以使用exists()函数,但用户可能更常用的是1.0的语法,因为2.0的支持可能因处理器而异。 另外,用户可能在循环外部也需要判断某个元素是否存在,例如在整个文档范围内检查是否有某个标签,这时候可能需要使用//来搜索全局,或者指定具体的路径。例如,//author会检查整个文档中是否存在任何author元素。 还需要提醒用户关于命名空间的问题。如果XML文档使用了命名空间,那么在XSLT中必须正确声明和使用命名空间前缀,否则条件判断可能会失败。例如,如果元素在某个命名空间下,而XSLT中没有声明对应的前缀,test="ns:element"就会找不到元素。 此外,示例代码对用户理解会很有帮助。我应该给出一个具体的例子,比如遍历books,每个book下检查是否存在author,如果存在则显示,否则显示“无作者”。这样的例子能够直观地展示如何结合<xsl:for-each>和<xsl:if>或<xsl:choose>来实现需求。 可能还需要提到性能方面的注意事项,比如在循环内部频繁使用//或复杂的XPath可能会影响性能,尤其是在处理大型XML文件时。建议尽量使用相对路径或更精确的路径来提高效率。 最后,根据用户的问题,生成相关的问题,比如如何检查属性是否存在,或者如何在XSLT中使用其他条件判断函数,这些都可以作为扩展问题帮助用户进一步学习。</think>### XSLT循环中判断元素存在的方法 在XSLT中,若需在循环中判断某个标签是否存在,可通过`<xsl:if>`或`<xsl:choose>`结合XPath表达式实现。核心方法是利用`test`属性验证元素存在性: 1. **基本语法** ```xml <xsl:for-each select="节点集合"> <xsl:if test="目标元素"> <!-- 元素存在时的逻辑 --> </xsl:if> </xsl:for-each> ``` 2. **完整示例** ```xml <xsl:template match="/"> <output> <xsl:for-each select="books/book"> <item> <title><xsl:value-of select="title"/></title> <xsl:if test="author"> <author><xsl:value-of select="author"/></author> </xsl:if> </item> </xsl:for-each> </output> </xsl:template> ``` 此代码会遍历所有`book`节点,仅当`author`子元素存在时输出作者信息[^1]。 3. **多条件判断** 使用`<xsl:choose>`处理复杂逻辑: ```xml <xsl:choose> <xsl:when test="price > 100">高价书</xsl:when> <xsl:when test="discount">特价书</xsl:when> <xsl:otherwise>普通书</xsl:otherwise> </xsl:choose> ``` 4. **全局存在性验证** 使用`//`选择符检查文档级存在性: ```xml <xsl:if test="//special_tag"> <!-- 全文档存在特殊标签时的处理 --> </xsl:if> ``` **注意事项:** - 命名空间需正确声明 - XPath表达式区分大小写 - 使用`count()`函数可精确控制数量阈值[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值