1

我有一个从数据库信息生成的 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 文件出现在浏览器中。

4

2 回答 2

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)
于 2013-09-12T20:30:02.180 回答
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)
于 2013-09-12T20:32:40.327 回答