问个样式转换的问题(两种转换方式的结果不同)

Geniusth 2005-04-06 10:55:47
我有三个文件:
results.xml(待转换的源文件):

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="Test.xslt"?>
<results>
<NS:Clip xmlns:NS="http://myFootballMatch" src="http://Multimedia/FootballMatches/worldcupChileArgentina2.rm" IfIn="false">
<NS:Action>角球</NS:Action>
<NS:Duration>
<NS:StartTime>00:32:54Z</NS:StartTime>
<NS:EndTime>00:33:06Z</NS:EndTime>
</NS:Duration>
<NS:Team>智利</NS:Team>
<NS:Player>7号</NS:Player>
<NS:Remark>球没进</NS:Remark>
</NS:Clip>
<NS:Clip xmlns:NS="http://myFootballMatch" src="http://Multimedia/FootballMatches/worldcupChileArgentina2.rm" IfIn="false">
<NS:Action>角球</NS:Action>
<NS:Duration>
<NS:StartTime>00:56:13Z</NS:StartTime>
<NS:EndTime>00:56:33Z</NS:EndTime>
</NS:Duration>
<NS:Team>阿根廷</NS:Team>
<NS:Player>8号里克尔梅</NS:Player>
<NS:Remark>球没进,又获得一个角球</NS:Remark>
</NS:Clip>
<NS:Clip xmlns:NS="http://myFootballMatch" src="http://Multimedia/FootballMatches/worldcupChileArgentina2.rm" IfIn="false">
<NS:Action>角球</NS:Action>
<NS:Duration>
<NS:StartTime>00:56:34Z</NS:StartTime>
<NS:EndTime>00:56:56Z</NS:EndTime>
</NS:Duration>
<NS:Team>阿根廷</NS:Team>
<NS:Player>15号达莱桑德罗</NS:Player>
<NS:Remark>球没进</NS:Remark>
</NS:Clip>
</results>


test.xslt(样式文件):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" xmlns:matchs="http://myFootballMatch" exclude-result-prefixes="#default matchs">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="results">
<html xmlns="http://www.w3.org/1999/xhtml" lang="UTF-8">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>新闻</title>
<link href="news.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="results/matchs:Clip">
<table>
<tbody>
<tr>
<th>Item<xsl:value-of select="position()"/></th>
</tr>
<tr>
<td class="title">
<b>动作:</b>
</td>
<td><xsl:value-of select="matchs:Action"/></td>
</tr>
<tr>
<td class="title">
<b>队名:</b>
</td>
<td><xsl:value-of select="matchs:Team"/></td>
</tr>
<tr>
<td class="title">
<b>队员名:</b>
</td>
<td><xsl:value-of select="matchs:Player"/></td>
</tr>
<tr>
<td class="title">
<b>是否有进球:</b>
</td>
<td>
<xsl:variable name="isGoal" select="@IfIn"/>
<xsl:if test="$isGoal = 'false'">
<xsl:text>否</xsl:text>
</xsl:if>
<xsl:if test="$isGoal = 'true'">
<xsl:text>是</xsl:text>
</xsl:if>
</td>
</tr>
<tr>
<td class="title">
<b>评论:</b>
</td>
<td><xsl:value-of select="matchs:Remark"/></td>
</tr>
</tbody>
</table>
<br />
</xsl:template>
</xsl:stylesheet>


program.cs(用于转换的C#程序源代码):

#region Using directives

using System;
using System.Collections.Generic;
using System.Text;

#endregion

using System.IO;
using System.Xml;
using System.Xml.Query;
public class Sample {

public static void Main() {

// Create the XsltCommand object.
XsltCommand xslt = new XsltCommand();
xslt.OnMessageEvent += new QueryEventHandler(MessageCallBack);

// Compile the stylesheet.
xslt.Compile(@"E:\Test\Test.xslt");

// Transform the file.
xslt.Execute(@"E:\Test\results.xml", @"E:\Test\output.html");
}

// Display any event messages.
public static void MessageCallBack(object sender, QueryEventArgs e) {
Console.WriteLine("Message received: {0}", e.Message);
}
}


...全文
27 点赞 收藏 2
写回复
2 条回复
RealNick 2005年04月11日
up~~
回复 点赞
Geniusth 2005年04月06日
问题是这样的:
如果我直接用IE打开results.xml文件,那么结果将是:
引用
Item1
动作: 角球
队名: 智利
队员名: 7号
是否有进球: 否
评论: 球没进

Item2
动作: 角球
队名: 阿根廷
队员名: 8号里克尔梅
是否有进球: 否
评论: 球没进,又获得一个角球

Item3
动作: 角球
队名: 阿根廷
队员名: 15号达莱桑德罗
是否有进球: 否
评论: 球没进


如果我用这个C#写的程序进行转换,输出的html文件用IE打开,结果将是:
引用
Item2
动作: 角球
队名: 智利
队员名: 7号
是否有进球: 否
评论: 球没进

Item4
动作: 角球
队名: 阿根廷
队员名: 8号里克尔梅
是否有进球: 否
评论: 球没进,又获得一个角球

Item6
动作: 角球
队名: 阿根廷
队员名: 15号达莱桑德罗
是否有进球: 否
评论: 球没进


请问这是为什么?两种方式产生的结果为什么会不同?
我期望的结果是第一种,但是程序转换的结果确不是我想要的。
请问我哪里写的有问题吗?(xslt或者C#)
请指点,谢谢。

注:results.xml中的<?xml-stylesheet type="text/xsl" href="Test.xslt"?> 一行是我后来加上去的,原来的文件没有,只是为了能直接在IE中查看而已。

后来我与其他人研究了一下,如果使用.Net 1.1中提供的XslTransform类(XsltCommand是.Net 2.0中新加入的)则与预期结果相同,代码如下:

//Create a new XslTransform object.
XslTransform xslt = new XslTransform();

//Load the stylesheet.
xslt.Load(@"E:\Test\test.xslt");

//Create a new XPathDocument and load the XML data to be transformed.
XPathDocument mydata = new XPathDocument(@"E:\Test\results.xml");

//Create an XmlTextWriter which outputs to the console.
XmlWriter writer = new XmlTextWriter(Console.Out);

//Transform the data and send the output to the console.
xslt.Transform(mydata,null,writer, null);


另外,我又使用Java开源项目Xalan写了一个类似代码片断(代码来自Xalan中的一个实例SimpleTransform),转换的结果与用XsltCommand的结果一样,也就是说与我预期的结果不同。代码如下:

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

/**
* Use the TraX interface to perform a transformation in the simplest manner possible
* (3 statements).
*/
public class SimpleTransform {
public static void main(String[] args)
throws TransformerException, TransformerConfigurationException,
FileNotFoundException, IOException {
// Use the static TransformerFactory.newInstance() method to instantiate
// a TransformerFactory. The javax.xml.transform.TransformerFactory
// system property setting determines the actual class to instantiate --
// org.apache.xalan.transformer.TransformerImpl.
TransformerFactory tFactory = TransformerFactory.newInstance();

// Use the TransformerFactory to instantiate a Transformer that will work with
// the stylesheet you specify. This method call also processes the stylesheet
// into a compiled Templates object.
Transformer transformer = tFactory.newTransformer(new StreamSource("html.xslt"));

// Use the Transformer to apply the associated Templates object to an XML document
transformer.transform(new StreamSource("results7.xml"), new StreamResult(new

FileOutputStream("out.html")));

System.out.println("************* The result is in birds.out *************");
}
}


请问这是为什么呢?为什么结果会不同呢?请帮忙分析解释一下,谢谢。
回复 点赞
发动态
发帖子
XML/XSL
创建于2007-09-28

7876

社区成员

2.2w+

社区内容

XML/XSL相关问题讨论专区
社区公告
暂无公告