1

データベース情報から生成された XML ドキュメントがあります。別の XMLT ファイルもあります。XSL リンクを XML ドキュメントに挿入するには、VB.NET を使用する必要があります。挿入していますが、間違った場所に挿入しています。ヘッダーに必要ですが、ルートノードの後に​​配置しています。

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

0

ルート ノードの概念とドキュメント要素の概念を混同している可能性があります。ルートノードは、他のすべてのノードを含むノードです。これは非表示の名前のないノードです。例として、指定された望ましい出力を取り上げます。

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

その XML ドキュメントでは、DocumentRoot要素とxml-stylesheet処理命令の両方がルート ノードの子です。ドキュメント要素は別のものです。各 XML ドキュメントには、ルート ノードの子要素を 1 つしか含めることができません。つまり、次のようなものは整形式ではありません。

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

ルートレベルの要素は 1 つしか持てないため、その要素はdocument 要素と呼ばれます。したがって、ドキュメント要素に子を追加したいと言った場合、それは子としてルート ノードに追加されません。むしろ、あなたの例では、ドキュメント要素に子として追加します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 に答える