VB.NET中XslCompiledTransform和xslt的问题

时间:2011-06-02 12:14:02

标签: asp.net xslt xslcompiledtransform

我现在正在接受这个。我有一个XML文档,必须使用xslt表进行转换。我的代码如下:

        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中的

Token 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>

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

此消息不言自明。这意味着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文档 - 调试并修复它。