一个比较bt的xslt
2009-01-13 17:22
134 查看
最近碰到一个比较bt的xslt的转换需求,简化后,原xml是:
但是目前还很难把目标格式从转换方法中分离出来,这个就有待以后再改良吧。
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> <xsl:output method="html" indent="yes"/> <xsl:template match="/root"> <html> <title>test</title> <body> <xsl:variable name="dictinctNames"> <xsl:element name="items"> <xsl:call-template name="distinct"/> </xsl:element> </xsl:variable> <table> <tr> <xsl:for-each select="msxsl:node-set($dictinctNames)/items/item"> <td> <xsl:value-of select="@name"/> </td> </xsl:for-each> </tr> <xsl:call-template name="PrintValue"> <xsl:with-param name="items" select="*"/> <xsl:with-param name="distinctItems" select="msxsl:node-set($dictinctNames)/items/item"/> </xsl:call-template> </table> </body> </html> </xsl:template> <!-- Distinct value and create elements --> <xsl:template name="distinct"> <xsl:for-each select="*[generate-id(.) =generate-id(key('nameKey', name())[1])]"> <xsl:element name="item"> <xsl:attribute name="name"> <xsl:value-of select="name()"/> </xsl:attribute> </xsl:element> </xsl:for-each> </xsl:template> <!-- Set distinct key --> <xsl:key name="nameKey" match="*" use="name()" /> <!-- Print table content--> <xsl:template name="PrintValue"> <xsl:param name="items"/> <xsl:param name="distinctItems"/> <xsl:call-template name="PrintValueCore"> <xsl:with-param name="nextItems" select="$items"/> <xsl:with-param name="distinctItems" select="$distinctItems"/> <xsl:with-param name="nextDistinctItems" select="$distinctItems"/> </xsl:call-template> </xsl:template> <!-- Core method --> <xsl:template name="PrintValueCore"> <xsl:param name="nextItems"/> <xsl:param name="distinctItems"/> <xsl:param name="nextDistinctItems"/> <!-- if (nextItems.Count>0) --> <xsl:if test="count($nextItems)>0"> <xsl:if test="count($nextDistinctItems)=count($distinctItems)"> <xsl:text disable-output-escaping="yes"><![CDATA[<tr>]]></xsl:text> </xsl:if> <!-- if (nextDistinctItems.Count==0) --> <xsl:if test="count($nextDistinctItems)=0"> <xsl:text disable-output-escaping="yes"><![CDATA[</tr>]]></xsl:text> <!-- if (nextItems.Count>1) --> <xsl:if test="count($nextItems)>1"> <!-- PrintValueCore(nextItems,distinctItems,nextDistinctItems); --> <xsl:call-template name="PrintValueCore"> <xsl:with-param name="nextItems" select="$nextItems"/> <xsl:with-param name="distinctItems" select="$distinctItems"/> <xsl:with-param name="nextDistinctItems" select="$distinctItems"/> </xsl:call-template> </xsl:if> </xsl:if> <!-- if (nextDistinctItems.Count>0) --> <xsl:if test="count($nextDistinctItems)>0"> <!-- string first = nextDistinctItems[0].name --> <xsl:variable name="first" select="$nextDistinctItems[1]/@name"/> <!-- if (first==nextItem[0].name) --> <xsl:if test="$first=name($nextItems)"> <td> <!-- nextItem[0].value --> <xsl:value-of select="$nextItems[1]"/> </td> <!-- PrintValueCore(nextItems.Skip(1),distinctItems,nextDistinctItems.Skip(1)); --> <xsl:call-template name="PrintValueCore"> <xsl:with-param name="nextItems" select="$nextItems/following::*"/> <xsl:with-param name="distinctItems" select="$distinctItems"/> <xsl:with-param name="nextDistinctItems" select="$nextDistinctItems/following::*"/> </xsl:call-template> </xsl:if> <!-- if (first!=nextItem[0].name) --> <xsl:if test="not($first=name($nextItems))"> <td/> <!-- PrintValueCore(nextItems,distinctItems,nextDistinctItems.Skip(1)); --> <xsl:call-template name="PrintValueCore"> <xsl:with-param name="nextItems" select="$nextItems"/> <xsl:with-param name="distinctItems" select="$distinctItems"/> <xsl:with-param name="nextDistinctItems" select="$nextDistinctItems/following::*"/> </xsl:call-template> </xsl:if> </xsl:if> </xsl:if> <!-- if (nextItems.Count==0) --> <xsl:if test="count($nextItems)=0"> <!-- if (nextDistinctItems.Count>0) --> <xsl:if test="count($nextDistinctItems)>0"> <td/> <!-- PrintValueCore(nextItems,distinctItems,nextDistinctItems.Skip(1)); --> <xsl:call-template name="PrintValueCore"> <xsl:with-param name="nextItems" select="$nextItems"/> <xsl:with-param name="distinctItems" select="$distinctItems"/> <xsl:with-param name="nextDistinctItems" select="$nextDistinctItems/following::*"/> </xsl:call-template> </xsl:if> <!-- if (nextDistinctItems.Count==0) --> <xsl:if test="count($nextDistinctItems)=0"> <xsl:text disable-output-escaping="yes"><![CDATA[</tr>]]></xsl:text> </xsl:if> </xsl:if> </xsl:template> </xsl:stylesheet>
但是目前还很难把目标格式从转换方法中分离出来,这个就有待以后再改良吧。
相关文章推荐
- 对一个安全设置比较BT的虚拟主机的安全测试
- 如何和BT一样建立一个比较大的文件,然后再写入
- 进程与线程的区别一个比较形象解释
- 一个比较实用的考试系统
- HTMLParser(一个比较流行的html代码解析、处理开源项目)学习,总结
- (STL中自带的排序功能7.3.3)POJ 1318 Word Amalgamation(求解一个单词是否在字典里面。解法:将单词按字典序处理后的结果与字典中的单词安字典序处理后的结果进行比较)
- 请定义一个宏,比较两个数的a、b的大小,不能使用大于、小于、if语句
- 一个比较全的的log4j配置文件(log4j.properties)转载
- 推荐一个比较不错JSON字符串处理网站,虽然性能不是很强,但是还不错比起其他的
- 今晚发现一个比较有趣的js过关游戏,分享下
- 编写一个程序 用宏实现两个数的比较大小
- 一个很好用的文本比较工具(日文版)--DF
- 请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句
- 一个比较综合的项目--》>图片缓存,下拉刷新等
- 一个奇妙的java坑:Long 类型的比较
- 推荐一个好的文献查阅网站,速度很快,可以赚金币,比较好玩
- 转一个解析linux内核I2C体系结构的例子,说的比较清楚 .
- 分享给大家一个比较装逼的小代码
- js中一个比较另类的string转number的方式..
- 一个比较全介绍UltraGrid的博客