在根元素之前添加xml-stylesheet处理指令

时间:2013-09-12 18:45:54

标签: xml vb.net xmldocument

我有一个从数据库信息生成的XML文档。我还有一个单独的XMLT文件。我需要使用VB.NET将XSL链接插入XML文档。我正在插入它,但它插入到错误的地方。我需要它在标题中,但它将它放在根节点之后。

这是我用来插入xml-stylsheet处理指令的代码:

Dim fiFilePath As String = Me.CSFileName
Dim xmlCs As XmlDocument = Nothing
Try
    xmlCs = New XmlDocument()
    xmlCs.Load(fiFilePath)
    ' update the XSLT path as per the 'newStyleSheetPath' argument
    xmlCs.DocumentElement.PrependChild(xmlCs.CreateProcessingInstruction("xml-stylesheet", String.Format("type={0}text/xsl{1} href={2}{3}{4}", Chr(34), Chr(34), Chr(34), newStylesheetPath, Chr(34))))
    'Save the created document
    xmlCs.Save(fiFilePath)
Catch ex As Exception
    xmlCs = Nothing
    fiFilePath = Nothing
    Throw ex
End Try

这是代码输出的内容:

<DocumentRoot>
  <?xml-stylesheet type="text/xsl" href="APSCS.xsl"?>
  <realmCode code="US" />

但它必须是:

<?xml-stylesheet type="text/xsl" href="APSCS.xsl"?>
<DocumentRoot>
  <realmCode code="US" />

这是XSLT与XML一起打包的导出的所有部分,因此如果有人打开XML,它将使用随之发送的XSLT文件显示在浏览器中。

2 个答案:

答案 0 :(得分:1)

这应该有效:

xmlCs.InsertBefore(xmlCs.CreateProcessingInstruction("xml-stylesheet", String.Format("type={0}text/xsl{1} href={2}{3}{4}", Chr(34), Chr(34), Chr(34), newStylesheetPath, Chr(34))), xmlCs.DocumentElement)

答案 1 :(得分:0)

您可能会将根节点的概念与文档元素的概念混淆。 根节点是包含所有其他节点的节点。它是一个隐藏的,未命名的节点。以您所陈述的所需输出为例:

<?xml-stylesheet type="text/xsl" href="APSCS.xsl"?>
<DocumentRoot>
    <realmCode code="US" />
</DocumentRoot>

在该XML文档中,DocumentRoot元素和xml-stylesheet处理指令都是根节点的子元素。 文档元素是不同的东西。在每个XML文档中,只能有一个元素是根节点的子元素。换句话说,像这样的东西格式良好:

<?xml-stylesheet type="text/xsl" href="APSCS.xsl"?>
<DocumentRoot1>
    <realmCode code="US" />
</DocumentRoot1>
<DocumentRoot2>
    <realmCode code="US" />
</DocumentRoot2>

由于您只能有一个根级元素,因此该元素称为文档元素。因此,当您说要将子项添加到文档元素时,它不会将其作为子项添加到根节点。相反,它会将它作为子元素添加到文档元素中,在您的示例中,它是DocumentRoot

XmlDocument对象本身就是对根元素的引用。因此,要在根级别添加子级,您需要这样做:

xmlCs.AppendChild(...)  ' Adds child at the root level
xmlCs.DocumentElement.AppendChild(...)  ' Adds child under the DocumentRoot element

要在DocumentRoot元素之前添加处理指令,可以使用InsertBefore方法,如下所示:

xmlCs.InsertBefore(xmlCs.CreateProcessingInstruction("xml-stylesheet", String.Format("type={0}text/xsl{1} href={2}{3}{4}", Chr(34), Chr(34), Chr(34), newStylesheetPath, Chr(34))), xmlCs.DocumentElement)