【问题标题】:Problem with XslCompiledTransform and xslt in VB.NETVB.NET 中 XslCompiledTransform 和 xslt 的问题
【发布时间】:2011-09-07 01:06:53
【问题描述】:

我现在知道了。我有一个必须使用 xslt 工作表转换的 XML 文档。我的代码如下:

        Dim xStream As New IO.MemoryStream

        ' Create the XslCompiledTransform and load the stylesheet.
        Dim xslt As New XslCompiledTransform()
        xslt.Load(strLKxsl)

        ' Create the XslCompiledTransform and load the stylesheet.
        Dim xslt As New XslCompiledTransform()
        xslt.Load(strXSLfolder & "xslt_lookup.xslt")

        ' Create the XsltArgumentList.
        Dim xslArg As New XsltArgumentList()

        Using w As XmlWriter = XmlWriter.Create(xStream)
            ' Transform the file.
            xslt.Transform(xmldLookup, Nothing, w)
        End Using

我在 xslt.Transform(xmldLookup, Nothing, w) 行收到以下错误:

处于 EndRootElement 状态的令牌 StartElement 将导致无效的 XML 文档。如果要编写 XML 片段,请确保 ConformanceLevel 设置设置为 ConformanceLevel.Fragment 或 ConformanceLevel.Auto。

这是 XML 文件的内容:

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="includes/xslt_lookup.xslt"?>
<lookup xmlns="logis-online:lk"
title="<Document Title>"
nexturl="<URL>">

  <search visible="false">
    <field id="SUPPLIER_NO" hidden="true" size="10"
    value="<Value>" />
    <field id="WEB_STORE_NO" hidden="true" size="10"
    value="<Value>" />
    <field id="REST" hidden="true" size="40" value="" />
    <field id="LOOKUP_ACTION" hidden="true" size="1" value="<Value>" />
    <field id="WEB_ACTION" hidden="true" size="2" value="<Value>" />
  </search>
  <results>
    <header>
      <section>
        <item id="SUPPLIER_NO" title="Supplier No" value="<Value>"
        HelpID="10" />
        <item id="SUPPLIER_NAME_SHORT" title="Supplier Name"
        value="<Value>" HelpID="10" />
        <item id="LIABLE_STORE_NO" title="Liable Store No"
        value="<Value>" HelpID="98" />
      </section>
    </header>
    <list target="<lookup aspx page>" />
  </results>
</lookup>

【问题讨论】:

  • 我假设 title="&lt;Document Title&gt;" 并不真正在您的 XSLT 中,您有类似 title="ABC" 的东西 - 对吧?
  • 请向我们展示样式表代码,我们至少需要查看任何xsl:output 说明。您想要纯文本文件还是 HTML 文档或 XML 文档作为转换结果?

标签: asp.net xslt xslcompiledtransform


【解决方案1】:

问题可能是由于您的 XSLT 代码创建的一些输出不是格式良好的 XML 文档,而只是一个片段,可能有几个顶级元素。 XSLT 可以做到这一点,如果您只是写入文件或流,您应该不会有任何问题。由于您尚未解释的原因,您的代码在 MemoryStream 上构造了一个 XmlWriter,并且默认情况下,使用 XmlWriter.Create(stream) 创建的任何 XmlWriter 都会检查任何输出是否是格式正确的 XML 文档,如果不是则抛出异常。 因此,为了避免这个问题,您要么根本不创建 XmlWriter,而是简单地做

xslt.Transform(xmldLookup, Nothing, xStream)

或者您使用 XslCompiledTransform 实例的 OutputSettings 创建一个 XmlWriter,例如

Using xw As XmlWriter = XmlWriter.Create(xStream, xslt.OutputSettings)

【讨论】:

【解决方案2】:

此消息是不言自明的。这意味着 XSLT 转换的结果不是格式良好的文档,为了强制 XmlWriter 编写这样的内容,必须将其 ConformanceLevel 设置/指定为ConformanceLevel.FragmentConformanceLevel.Auto。阅读更多关于“XmlWriter 的数据一致性”here

如果 XSLT 转换不打算生成 XML 文档,最好不要指定 XmlWriter 来生成结果。更好的选择是使用 Transform() overload that accepts a TextWriter argument

否则,您可以直接写入流(不指定任何 XmlWriter)。

或者,create an XmlWriter使用适当的XmlWriterSettings(指定ConformanceLevel.FragmentConformanceLevel.Auto)。

或者,如果 XSLT 转换必须生成 XML 文档——调试并修复它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-13
    • 2018-05-01
    • 2010-11-10
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多