通过XSLT方式以特定分隔符处理XML节点数据(续) 

2008/3/20 12:05:22


阅读全文(4301) | 回复(7) | 编辑 | 精华

前文《通过XSLT方式以特定分隔符处理XML节点数据》转换结果是HTML方式,本文则将转换结果以XML文档输出,从而实现TXT2XML的转换。但本文并不介绍TXT的处理方法,只在文中进行穿插简单说明。 本文所采用的TXT示例,是从WEB页中的规范表格COPY出来的2008年上证指数部分数据。从所周知,从WEB表格中COPY数据,行间有换行符,列间以空格分隔(注意行尾也包涵这样一个空格),根据这个特征,“换行符”和“空格”理所当然就成为我们转换的“特定分隔符”。 sh2008.txt: 日期 开盘 最高 最低 收盘 交易量 交易金额 20080101 5320.01 5336.50 5248.69 5261.56 77187038 13368040.10 20080102 5265.00 5295.02 5201.89 5272.81 76566609 13302830.80 20080103 5269.80 5321.46 5211.05 5319.86 98510323 17042983.40 20080104 5328.41 5372.46 5318.46 5361.57 80875238 14554503.40 20080107 5357.45 5403.35 5332.60 5393.34 91933001 16222579.50 20080108 5414.56 5480.07 5344.65 5386.53 1024778 18460054.20 20080109 5365.22 5437.76 5346.85 5435.81 76805862 13944898.60 20080110 5449.16 5483.83 5407.31 5456.54 96553285 17413830.80 20080111 5471.39 5500.06 5423.81 5484.68 87724750 15587495.80 20080114 5507.58 5522.78 5456.93 5497.90 78714090 14225072.90 20080115 5503.93 5505.03 5405.60 5443.79 80719506 15153059.00 20080116 5395.28 5396.04 5288.77 5290.61 89278341 16195460.10 20080117 5235.91 5312.29 5039.79 5151.63 98941952 17474017.70 20080118 5141.37 5187.60 5093.13 5180.51 68635625 11836692.20 要通过XSLT转换,就须要把TXT转换成符合规范的XML文档,这样,我们就需要通过开发语言读取TXT的内容,作为只有一个根节点的XML文档的节点值。格式如下: <?xml version="1.0" encoding="gb2312"?> <root> TXT文本内容 </root> 这样,我们就可以轻松地通过XSL转换XML为符合要求的XML文档了。   text2xml4out.xsl: <?xml version="1.0" encoding="gb2312"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" version="1.0" encoding="gb2312" indent="yes"/> <xsl:template match="/"> <root>       <xsl:apply-templates select="root"/> </root> </xsl:template>   <xsl:template match="root">       <xsl:call-template name="msg">             <xsl:with-param name="msg" select="." />             <xsl:with-param name="pos" select="1" />       </xsl:call-template> </xsl:template>   <xsl:template name="msg">       <xsl:param name="msg"/>       <xsl:param name="pos"/>       <xsl:variable name="sb" select="substring-before($msg,' ')"/>       <xsl:variable name="ps">             <xsl:choose>             <xsl:when test="$pos mod 8=0">1</xsl:when>             <xsl:otherwise><xsl:value-of select="$pos"/></xsl:otherwise>             </xsl:choose>       </xsl:variable>       <xsl:choose>             <xsl:when test="$ps = 1"><D><xsl:value-of select="$sb"/></D></xsl:when><!--日期-->             <xsl:when test="$ps = 2"><S><xsl:value-of select="$sb"/></S></xsl:when><!--开盘-->             <xsl:when test="$ps = 3"><H><xsl:value-of select="$sb"/></H></xsl:when><!--最高-->             <xsl:when test="$ps = 4"><L><xsl:value-of select="$sb"/></L></xsl:when><!--最低-->             <xsl:when test="$ps = 5"><E><xsl:value-of select="$sb"/></E></xsl:when><!--收盘-->             <xsl:when test="$ps = 6"><V><xsl:value-of select="$sb"/></V></xsl:when><!--交易量-->             <xsl:when test="$ps = 7"><P><xsl:value-of select="$sb"/></P></xsl:when><!--交易额-->       </xsl:choose>         <xsl:if test="contains($msg,' ')">             <xsl:call-template name="msg">                  <xsl:with-param name="msg" select="substring($msg,string-length($sb)+2)" />                  <xsl:with-param name="pos" select="$ps+1" />             </xsl:call-template>       </xsl:if> </xsl:template>   </xsl:stylesheet>   一次转换结果: <?xml version="1.0" encoding="gb2312"?> <root>       <D>20080101</D>       <S>5320.01</S>       <H>5336.50</H>       <L>5248.69</L>       <E>5261.56</E>       <V>77187038</V>       <P>13368040.10</P>       <D>20080102</D>       <S>5265.00</S>       <H>5295.02</H>       <L>5201.89</L>       <E>5272.81</E>       <V>76566609</V>       <P>13302830.80</P>       … </root>   以是结果并不是我们想要的结果,为了得到可读性强的XML文档,这里需要进行二次转换: addgroupitem.xsl: <?xml version="1.0" encoding="gb2312"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" version="1.0" encoding="gb2312" indent="yes"/>   <xsl:template match="/"> <root>       <xsl:apply-templates select="//D[position()&gt;1][position()&lt;last()]"/> </root> </xsl:template>   <xsl:template match="D">       <DATA>             <xsl:copy-of select="."/>             <xsl:copy-of select="./following-sibling::*[1]"/>             <xsl:copy-of select="./following-sibling::*[2]"/>             <xsl:copy-of select="./following-sibling::*[3]"/>             <xsl:copy-of select="./following-sibling::*[4]"/>             <xsl:copy-of select="./following-sibling::*[5]"/>             <xsl:copy-of select="./following-sibling::*[6]"/>       </DATA> </xsl:template>   </xsl:stylesheet>   二次转换结果,即最终转换结果: sh2008.xml: <?xml version="1.0" encoding="gb2312"?> <root>       <DATA>             <D>20080101</D>             <S>5320.01</S>             <H>5336.50</H>             <L>5248.69</L>             <E>5261.56</E>             <V>77187038</V>             <P>13368040.10</P>       </DATA>       <DATA>             <D>20080102</D>             <S>5265.00</S>             <H>5295.02</H>             <L>5201.89</L>             <E>5272.81</E>             <V>76566609</V>             <P>13302830.80</P>       </DATA> … </root>   在本文的阅读过程中,也许有人会问,为什么进行二次转换?一次转换能否实现?我的回答是,一次转换同样能够实现,但这里用了二次转换,目的是让阅读的人更容易理解。 这里,我给出一次转换的思路:采用两个命名模板,第一个call-template每次截取一个换行符前的数据,第一个call-template每次截取一个空格前的数据,交替调用,即可实现XML2XML一次转换。有兴趣的朋友可以尝试写代码试试,记得贴在这里哦~~~~~~   原创:http://Qr.blogger.org.cn

Qr

Posted by Qr on 2008/3/20 12:05:22

回复:通过XSLT方式以特定分隔符处理XML节点数据(续)

2008/4/21 10:19:37


个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

following-sibling

彭建美(游客)

Posted by 彭建美(游客) on 2008/4/21 10:19:37

回复:通过XSLT方式以特定分隔符处理XML节点数据(续)

2008/3/26 14:24:24

因为我们是搞土木的科研单位,对XML技术知之甚少,只是想请你来我们单位讲课,另外有可能邀请您参加参加我们这边一个关于XML的项目合作,都是有酬劳的。如果您不是北京的就算了,我们另外找人。   以下为blog主人的回复:  

冯如松(游客)

Posted by 冯如松(游客) on 2008/3/26 14:24:24

回复:通过XSLT方式以特定分隔符处理XML节点数据(续)

2008/3/24 20:34:14

QR老师,如果你觉得不方便的话,可以给我发email,fengrs@126.com真的有正事 以下为blog主人的回复:  我不是北京的。有事可以上中国XML论坛给我发站内信息。如果是毕业论文、杂志之类的邀约就免谈了。

冯如松(游客)

Posted by 冯如松(游客) on 2008/3/24 20:34:14

回复:通过XSLT方式以特定分隔符处理XML节点数据(续)

2008/3/24 14:12:01

QR老师,我可找到你家了~ 你是北京的吗?能不能说下你的联系方式,我有事想和你商量!

冯如松(游客)

Posted by 冯如松(游客) on 2008/3/24 14:12:01

回复:通过XSLT方式以特定分隔符处理XML节点数据(续)

2008/3/21 13:17:24

春天来了,用11号兜风吧。 以下为blog主人的回复: 今天上班没空,明天一定是个好天气,踏青去咯  

烟雨朦胧

Posted by 烟雨朦胧 on 2008/3/21 13:17:24

回复:通过XSLT方式以特定分隔符处理XML节点数据(续)

2008/3/20 14:46:20

以下引用青青子瑾在2008-3-20 13:32:19的评论:呵呵,,你终于结束冬眠了。 倒是经常上来瞧瞧,只是这段时间没什么心情写代码和文章。春天总算来了  

Qr

Posted by Qr on 2008/3/20 14:46:20

回复:通过XSLT方式以特定分隔符处理XML节点数据(续)

2008/3/20 13:32:19

呵呵,春天来了,你终于结束冬眠了。

烟雨朦胧

Posted by 烟雨朦胧 on 2008/3/20 13:32:19

» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)
站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.125 second(s), page refreshed 144755024 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号