• 主页
  • ASP
  • .NET Framework
  • Web Services
  • VB
  • VC
  • 图表区
  • 分析与设计
  • 组件/控件开发
  • LINQ

求解XSLT格式化问题!

dicman 2005-10-12 04:27:58
XML文档格式如下:
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="syn_test.xsl"?>
<Servers Update='9/6/2005 11:37:26 AM'>
<Server Name="Newsql">
<Db Name="Abs">
<Article Name="InventoryTransaction">
<Chain Name="Abs - inventoryTransaction">A</Chain>
<Chain Name="Abs - inventoryTransaction">B</Chain>
<Chain Name="Abs - inventoryTransaction">C</Chain>
<Chain Name="Rp_AbsInventoryTransaction_Trn">D</Chain>
</Article>
</Db>
<Db Name="act">
<Article Name="ABS_Dep">
<Chain Name="act">E</Chain>
<Chain Name="act">F</Chain>
</Article>
<Article Name="ApCheck">
<Chain Name="act">G</Chain>
<Chain Name="act-datawarehouse">H</Chain>
<Chain Name="act">I</Chain>
</Article>
</Db>
</Server>
<Servers>

要求将上述XML文档格式化成以下格式:
-------------------------------------------------------------------------------------
| Server | DB | TableName | Chain |
-------------------------------------------------------------------------------------
| Newsql | Abs | InventoryTransaction | A |
| | | |-------------------------------|
| | | | B |
| | | |-------------------------------|
| | | | C |
| | | |-------------------------------|
| | | | D |
| |------------|---------------------------|-------------------------------|
| | act | ABS_Dep | E |
| | | |-------------------------------|
| | | | F |
| | |---------------------------|-------------------------------|
| | | ApCheck | G |
| | | |-------------------------------|
| | | | H |
| | | |-------------------------------|
| | | | I |
|-----------------------------------------------------------------------------------|

求XSL文件源代码及详细思路,小弟实在写不出了,不得已出此下策,感谢各位了!
如表格显示杂乱,请将表格拷贝到记事本就能显示正确的格式
...全文
126 点赞 收藏 6
写回复
6 条回复
lijiangchxp2005 2005年10月13日
你先用 DW 将结果给为 HTML 文件,再由 HTML 文件改成 Xslt 就可以了
我原来显示报表就是用这种方式,先将要得到的结果画出来(HML)再改成xsl,报表比你这个还复杂
回复 点赞
dicman 2005年10月13日
感谢saucer(思归)给予正确解答,感谢Sunmast(Maybe I'm Amazed)的热心支持!
回复 点赞
saucer 2005年10月13日
maybe there is a better way, but try

syn_test.xsl:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates />
</body>
</html>
</xsl:template>
<xsl:template match="Servers">
<table border="1">
<tr>
<th>Server</th>
<th>DB</th>
<th>TableName</th>
<th>Chain</th>
</tr>
<xsl:apply-templates select="Server" />
</table>
</xsl:template>

<xsl:template match="Server">
<xsl:variable name="server" select="." />
<xsl:for-each select="Db">
<xsl:variable name="db" select="." />
<xsl:variable name="dbpos" select="position()" />
<xsl:for-each select="Article">
<xsl:variable name="article" select="." />
<xsl:variable name="artpos" select="position()" />
<xsl:for-each select="Chain">
<xsl:variable name="chainpos" select="position()" />
<tr>
<xsl:if test="$dbpos = 1 and $artpos = 1 and $chainpos = 1 ">
<td rowspan="{count($server//Chain)}"><xsl:value-of select="$server/@Name" /></td>
</xsl:if>

<xsl:if test="$artpos = 1 and $chainpos = 1 ">
<td rowspan="{count($db//Chain)}"><xsl:value-of select="$db/@Name" /></td>
</xsl:if>

<xsl:if test="$chainpos = 1 ">
<td rowspan="{count($article//Chain)}"><xsl:value-of select="$article/@Name" /></td>
</xsl:if>

<td><xsl:value-of select="." /></td>
</tr>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
回复 点赞
速马 2005年10月13日
>>> 求XSL文件源代码及详细思路,小弟实在写不出了,不得已出此下策
你这是求思路吗?
先学一下XSL/T的语法,看看MSDN上的MSXML 4.0的SDK
这种的用最基础的语法就能做到

弄不出来我明天可以帮你写一个
回复 点赞
sxBamboo 2005年10月12日
从搜索中找到该文章,小弟也想知道
回复 点赞
dicman 2005年10月12日
有人能解答吗?
回复 点赞
发动态
发帖子
.NET技术社区
创建于2007-09-28

4.9w+

社区成员

66.8w+

社区内容

.NET技术交流专区
社区公告
暂无公告