高分求解析性能最好的XSLT

hyee 2009-06-01 06:04:43
源XML如下:

<ROWSET>
<ROW>
<_keys>20570</_keys>
<YARDRANGEID>20570</YARDRANGEID>
<YARDGROUPID>17810</YARDGROUPID>
<YARDLANNO>K4</YARDLANNO>
<FROMBAYNO>53</FROMBAYNO>
<TOBAYNO>53</TOBAYNO>
<FROMROWNO>1</FROMROWNO>
<TOROWNO>5</TOROWNO>
<FROMTIER>1</FROMTIER>
<TOTIER>5</TOTIER>
<CELLCOUNT>25</CELLCOUNT>
<CELLUNIT>T</CELLUNIT>
<USEDCELL>0</USEDCELL>
<ASSIGNCELL>0</ASSIGNCELL>
<AVAILCELL>25</AVAILCELL>
<FILLRULE>P</FILLRULE>
<STATUS>Y</STATUS>
<RANGE_SEQ>1</RANGE_SEQ>
<RESERVECELL>0</RESERVECELL>
<LIMITEDCELL>0</LIMITEDCELL>
</ROW>
<ROW>
<_keys>20571</_keys>
<YARDRANGEID>20571</YARDRANGEID>
<YARDGROUPID>17810</YARDGROUPID>
<YARDLANNO>K4</YARDLANNO>
<FROMBAYNO>47</FROMBAYNO>
<TOBAYNO>47</TOBAYNO>
<FROMROWNO>1</FROMROWNO>
<TOROWNO>3</TOROWNO>
<FROMTIER>1</FROMTIER>
<TOTIER>5</TOTIER>
<CELLCOUNT>15</CELLCOUNT>
<CELLUNIT>T</CELLUNIT>
<USEDCELL>0</USEDCELL>
<ASSIGNCELL>0</ASSIGNCELL>
<AVAILCELL>15</AVAILCELL>
<FILLRULE>S</FILLRULE>
<STATUS>Y</STATUS>
<RANGE_SEQ>2</RANGE_SEQ>
<RESERVECELL>0</RESERVECELL>
<LIMITEDCELL>0</LIMITEDCELL>
</ROW>
</ROWSET>

要解析成:

<ROW>
<CONTENT>YARDRANGEID YARDGROUPID YARDLANNO FROMBAYNO TOBAYNO FROMROWNO TOROWNO FROMTIER TOTIER CELLCOUNT CELLUNIT USEDCELL ASSIGNCELL AVAILCELL FILLRULE STATUS RANGE_SEQ RESERVECELL LIMITEDCELL
</CONTENT>
</ROW>
<ROW>
<_keys>20570</_keys>
<CONTENT>
20570 17810 K4 53 53 1 5 1 5 25 T 0 0 25 P Y 1 0 0
<CONTENT>
</ROW>

说明如下:
1.解析出来的第一行是标题头,从第二行开始是每一ROW下各元素的数据合并,以tab键分开
2.从第二行开始,元素_keys要单独取出来,并且不包含在CONTENT里
3.最好不要用xsl:for-each,xsl:choose,因XML文件很大,用这种方法性能不佳
...全文
75 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hyee 2009-06-05
  • 打赏
  • 举报
回复
我需要的不是如何能解析出来,而是高效地解析。用for-each或函数的话,性能真的很普通。另外传入的XML数据室动态的,只有ROWSET和ROW固定,并且每个ROW下的子元素相同。ROWSET是根节点,ROW是行节点,ROW下的元素只有一级,你可以把一个ROWSET看做是一张数据库表,一个ROW理解为表中的一行数据,每列都可以看作是String。
其实用语言表达出来,是:输入一段XML,那么transform出的数据中
第一行写列出ROW的子元素名列表,以Tab隔开,_key元素除外
从第二行开始填充ROW下每个对应元素的text,以Tab隔开,_key元素单独列出
xudongdong_1990 2009-06-03
  • 打赏
  • 举报
回复
学习了,帮顶!
zhiyongtu 2009-06-03
  • 打赏
  • 举报
回复
说明:

以上XMLT得到的是与你要求对应的XML,即在记事本中看的效果(源码效果)与你的要求相应,而不是在IE中看的效果,因为在IE中看的效果是HTML的效果,那又有所不同,要加相关的HTML标记。

不知我对你的意图是否理解正确?
zhiyongtu 2009-06-03
  • 打赏
  • 举报
回复
试试这个:

ROWSET.xsl
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>

<xsl:template match="ROWSET">
<xsl:text> </xsl:text>
<ROWSET>
<xsl:text> </xsl:text>
<xsl:text> </xsl:text>
<ROW>
<xsl:text> </xsl:text>
<CONTENT>
<xsl:text> </xsl:text>
<xsl:text>YARDRANGEID YARDGROUPID YARDLANNO FROMBAYNO TOBAYNO FROMROWNO TOROWNO FROMTIER TOTIER CELLCOUNT CELLUNIT USEDCELL ASSIGNCELL AVAILCELL FILLRULE STATUS RANGE_SEQ RESERVECELL LIMITEDCELL</xsl:text>
<xsl:text> </xsl:text>
</CONTENT>
<xsl:text> </xsl:text>
</ROW>
<xsl:apply-templates />
<xsl:text> </xsl:text>
</ROWSET>
</xsl:template>

<xsl:template match="ROW">
<xsl:text> </xsl:text>
<ROW>
<xsl:text> </xsl:text>
<_keys><xsl:value-of select="_keys"/></_keys>
<xsl:text> </xsl:text>
<CONTENT>
<xsl:text> </xsl:text>
<!--<xsl:call-template name="cell"/>-->
<xsl:for-each select="*[position()!=1]">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:for-each>
<xsl:text> </xsl:text>
</CONTENT>
<xsl:text> </xsl:text>
</ROW>
</xsl:template>

</xsl:stylesheet>
lai3345678 2009-06-02
  • 打赏
  • 举报
回复
学习中,不太熟~~~
hyee 2009-06-01
  • 打赏
  • 举报
回复
最底下的 <CONTENT> 写错了,应该是 </CONTENT>

「已注销」 2009-06-01
  • 打赏
  • 举报
回复
看下 还不会这个 我才开始..

8,906

社区成员

发帖
与我相关
我的任务
社区描述
XML/XSL相关问题讨论专区
社区管理员
  • XML/XSL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧