【问题标题】:Cannot transform XML to HTML through .NET System.Xml.Xsl.XslCompiledTransform无法通过 .NET System.Xml.Xsl.XslCompiledTransform 将 XML 转换为 HTML
【发布时间】:2011-07-02 10:22:39
【问题描述】:

我有这个 xsl:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:cf="http://AAA"
                xmlns="http://AAA"
                exclude-result-prefixes="cf">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/cf:Content">
    <html>
      <head>
        <title>AAA</title>
      </head>
      <body>
        Hello everybody
      </body>
    </html>
  </xsl:template>

</xsl:stylesheet>

这个xml:

<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet href="myxsl.xslt" type="text/xsl"?>
<cf:Content xmlns:cf="http://AAA"
            xmlns="http://AAA">

  Hello.

</cf:Content>

xml引用的命名空间是我的一个xsd(验证正确)。

嗯,我用浏览器打开xml文件,xslt就可以了。

现在,我有这个代码:

string xml = "THE SAME XML OF THE XML FILE";

XslCompiledTransform transform = new XslCompiledTransform();
using (XmlReader xr = 
      XmlReader.Create("myxsl.xslt")) { 
   transform.Load(xr); 
}

try {
   using (StringWriter sw = new StringWriter())
   using (StringReader sr = new StringReader(xml))
   using (XmlReader xr = XmlReader.Create(sr)) {

      transform.Transform(xr, new XsltArgumentList(), sw);
      string html = sw.ToString();
      this.Preview_Literal.Text = html;

   }
} catch (Exception ex) {
throw ex;
}

当然会出现异常:

错误:根级别的数据是 无效的。第 1 行,位置 1。 - 类型: System.Xml.XmlException

有什么问题?

【问题讨论】:

  • 去掉&lt;?xml-stylesheet ...行还能用吗?
  • 哪条语句给了你例外?
  • 一些 cmets:如果您希望您的样式表创建 HTML 输出,那么使用 &lt;xsl:output method="html" .../&gt; 而不是 method="xml" 是正确的方法。如果您想创建 HTML 元素,请从 xsl:stylesheet 中删除 xmlns="http://AAA",因为 HTML 元素不属于该命名空间。这些都不能解释你得到的错误,但我怀疑这根本不是由 XSLT 引起的,而只是在输入标记被解析为 XML 时发生。您可以发布堆栈跟踪吗? xml 变量在哪里/如何填充?
  • @Martin:你说得对,删除命名空间是正确的选择,现在可以了。谢谢你 :) 把它作为你的答案,我会检查它作为这个问题的答案 :) 再次感谢
  • @martin:也许你想回答?

标签: c# .net xml xslt


【解决方案1】:

马丁的回答:

xsl:stylesheet 中删除默认命名空间xmlns="http://AAA",因为HTML 元素不属于该命名空间。比如&lt;head&gt;实际上默认是&lt;cf:head&gt;

【讨论】:

  • 问题:如果马丁已经回答过了,那为什么还要回答呢?
  • @John,因为我在“未回答”部分找到了这个问题。既然它有一个答案,而且是一个很好的答案,我认为它应该被“回答”。仅此而已。
  • 为什么不让马丁回答这个问题?
  • 如果您查看日期 - 马丁在 2011 年评论了答案。我在 2012 年发现了这个问题。我想他不会回来回答这个问题。约翰,我可以向你保证,我只是为协议放置了一个“答案”——标记这个问题已回答。
猜你喜欢
  • 1970-01-01
  • 2021-03-29
  • 1970-01-01
  • 1970-01-01
  • 2013-06-18
  • 2016-03-13
  • 2019-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多