铁匠

做人要低调
随笔 - 133, 评论 - 255 , 引用 - 184

导航

公告

文章分类

存档

随笔分类

相册

BLOG

网站

论坛

用Xslt实现XML数据的分组显示


业务需要,导出了一个XML数据文件,要把它格式化成为一个按日期来分组显示的文件。格式化显示XML文件,最适用的就是XSLT来做为XML的显示模板。查遍了MSDN,发现需要用XPATH的函数来对里面的数据进行判断,根据需要来处理是否让这一组数据显示。所以在里面加入了<xsl:if test="……">……</xsl:if>这样标记来做为一次过滤。因为XPATH里面并没有提供日期的处理函数,并且这个日期的判断比较复杂,所以我就自定义了一个函数来处理,为止,我引入了一个自己的命名空间 xmlns:user="http://mycompany.com/mynamespace",然后在这个空间里面定义自己的函数。好的,以下就是实现过程。
<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:msxsl="urn:schemas-microsoft-com:xslt"
      xmlns:user="http://mycompany.com/mynamespace"><!--定义自己的命名空间,为下面的自己定义函数提供支持  -->
<msxsl:script language="VBScript" implements-prefix="user"><!-- 引入命名空间,定义自已的函数 -->
<![CDATA[
function CheckDate(nodelist)<!-- 自定义函数-->
……
end function
]]>
</msxsl:script>
<xsl:template match="/">
<HTML>
</head>
<BODY>
<TABLE id= "table1" border="1" style= "border-collapse:collapse" width="650">
          <xsl:for-each select="Updates/Update">
     <xsl:if test="user:CheckDate(string(DateTime))=1"><!-- 根据返回的结果来判断显示还是不显示 -->
            <TR>
              <TD width="100">文夹名</TD>
     <TD width="550"><xsl:value-of select="FileName" /></TD>
            </TR>
…………………………………………………………
   </xsl:if>
   </xsl:for-each>
        </TABLE>
</BODY>

    </HTML>
  </xsl:template>
</xsl:stylesheet>
在代码里面可以看到我先调用了string来转换了XML中DateTime节点的数据类型,因为XML节点中的数据类型可以说是一种变体类型,没有具体的类型,而在这里的脚本函数,即使原来是弱类型的,这时候也会变成强类型,只要数据类型不一致操作就会出错,变体类型的,在里面就没有办法处理,所以先转化成为string,然后在里面再转化成为日期,再做进一步的处理。
同时,发现在XSLT中定义操作的脚本函数时,要用
<![CDATA[
function CheckDate(nodelist)
{
……
}
]]>
这样的形式把函数包围起来,不然会提示找不到函数。
附:
XPATH函数
Node set last(), position(), count(), id(), local-name(), namespace-uri(), name()
String   string(), concat(), starts-with(), contains(), substring-before(), substring-after(),
         substring(), string-length(),normalize-space(), translate()
Boolean  boolean(), not(), true(), false(), lang()
Number   number(), sum(), floor(), ceiling(), round()
XSLT 1.0 additions document(), key(), format-number(), current(), unparsed-entity-uri(), generate-id(), system-property()

发表于 2004年9月5日 13:31

评论

# re:用Xslt实现XML数据的分组显示

用Xslt实现XML数据的分组显示ooeess
2005-7-16 8:07 | 红外热像仪

Post Comment

主题  
姓名  
主页
校验码  
内容   
京ICP备 05050892号