我现在正在接受这个。我有一个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>
答案 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.Fragment
或ConformanceLevel.Auto
。阅读更多关于“XmlWriter的数据一致性” here 。
如果XSLT转换不是为了生成XML文档,最好不要指定XmlWriter来生成结果。更好的选择是使用 Transform() overload that accepts a TextWriter argument 。
否则,您只需直接写入流(不指定任何XmlWriter)。
或 create an XmlWriter 使用相应的 XmlWriterSettings (指定ConformanceLevel.Fragment
或ConformanceLevel.Auto
)。
或者,如果XSLT转换必须生成XML文档 - 调试并修复它。