0

我现在知道了。我有一个必须使用 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>
4

2 回答 2

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)
于 2011-06-02T12:54:14.663 回答
0

此消息是不言自明的。这意味着 XSLT 转换的结果不是格式良好的文档,为了强制 XmlWriter 编写这样的东西,它的 ConformanceLevel 设置必须设置/指定为ConformanceLevel.Fragmentor 或ConformanceLevel.Auto在此处阅读有关“XmlWriter 的数据一致性”的更多信息。

如果 XSLT 转换不打算生成 XML 文档,最好不要指定 XmlWriter 来生成结果。更好的选择是使用接受 TextWriter 参数的 Transform() 重载

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

或者,使用适当的XmlWriterSettings(指定或)创建一个 XmlWriterConformanceLevel.FragmentConformanceLevel.Auto

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

于 2011-06-02T12:54:27.040 回答