热门:网页模板.net视频教程JQueryMVCjsonExtJs源码示例三级联动JQuery菜单
您现在的位置:.Net中文社区>> XML编程>>正文内容

在xslt中实现split方法对查询字符串进行分隔

发布时间:2010年06月29日点击数: 佚名

xslt本身并没有提供现成的split方法让我们对给定的查询字符串进行有效的分隔,不过我们可以借助于substring-before和substring-after函数来实现split的效果。先看一个应用需求:
要进行格式化的xml文档内容

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <Items> 
  3.   <ItemA>a</ItemA> 
  4.   <ItemB>b</ItemB> 
  5.   <ItemC>c</ItemC> 
  6.   <ItemD>d</ItemD> 
  7.   <ItemE>e</ItemE> 
  8. </Items> 

用于查找节点内容的xslt文档

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  3.     xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" 
  4. > 
  5.   <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
  6.  
  7.   <xsl:param name="tag"/> 
  8.  
  9.   <xsl:template match="/"> 
  10.         <xsl:value-of select="//*[name() = $tag]" disable-output-escaping="yes"/> 
  11.   </xsl:template> 
  12. </xsl:stylesheet> 

将要查找的节点名称作为参数tag的值传递给上述xslt文档,它便能将xml文档中相关节点中的内容输出到页面上,如果xml文档节点中存储的是html标记内容,则在页面上显示的就是具有实际意义的超文本标记,这个是通过disable-output-escaping="yes"属性来决定的,如果该属性的值为false,则html标记会原样输出到页面上。
  现在的问题是,我想要上述xslt文档能通过接收到的参数输出多个匹配的xml节点中的内容,如接收到的参数为"ItemA,ItemB,ItemC",则在页面上依次输出这三个节点中的内容,怎么实现呢?最先想到的办法就是在xslt中实现一个类似于split函数的功能,对参数tag的值进行分解,最好是能将分解后的结果存放到数组中,然后遍历数组依次输出检索到的结果。但是xslt中没有split函数,而且也没有数组这种“高级”数据结构,xslt本身是xml文档,它只能实现一些比较简单的逻辑和运算。事实上,在xslt的XPath函数中有两个函数可以实现我们的需求。

  substring-before(string1, string2)函数:返回string2在string1中出现之前的子字符串,如substring-before("ItemA,ItemB,ItemC", ",")返回的结果是"ItemA"。

  substring-after(string1, string2)函数:返回string2在string1中出现之后的子字符串,如substring-after("ItemA,ItemB,ItemC", ",")返回的结果是"ItemB,ItemC"。

  有了这两个函数我们就可以实现上面所说的类似于split函数的功能了,下面是修改后的xslt文档的代码:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  3.     xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" 
  4. > 
  5.   <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
  6.  
  7.   <xsl:param name="tag"/> 
  8.  
  9.   <xsl:template match="/"> 
  10.  
  11.   <xsl:call-template name="output-tokens"> 
  12.       <xsl:with-param name="list" select="$tag"/> 
  13.       <xsl:with-param name="separator">,</xsl:with-param> 
  14.     </xsl:call-template> 
  15.   </xsl:template> 
  16.  
  17.   <xsl:template name="output-tokens"> 
  18.     <xsl:param name="list" /> 
  19.     <xsl:param name="separator" /> 
  20.     <xsl:variable name="newlist" select="concat(normalize-space($list), $separator)" /> 
  21.     <xsl:variable name="first" select="substring-before($newlist, $separator)" /> 
  22.     <xsl:variable name="remaining" select="substring-after($newlist, $separator)" /> 
  23.  
  24.     <xsl:value-of select="//*[name() = $first]" disable-output-escaping="yes"/> 
  25.     <br/> 
  26.  
  27.     <xsl:if test="substring-before($remaining, $separator) != ''"> 
  28.       <xsl:call-template name="output-tokens"> 
  29.         <xsl:with-param name="list" select="$remaining" /> 
  30.         <xsl:with-param name="separator" select="$separator" /> 
  31.       </xsl:call-template> 
  32.     </xsl:if> 
  33.   </xsl:template> 
  34.  
  35. </xsl:stylesheet> 

方法output-tokens用来进行字符串的拆分并在循环中依次输出查询结果,基本思路就是不断地调用substring-before和substring-after这两个函数逐步拆分分解出来的字符串,直到分解完毕。 

本站热点业务

更多模板/案例展示

热门推荐

关于我们 | 联系我们 | 团队日志 | 网站地图 | 网站合作