2013-09-12 3 views
1

У меня есть документ XML, который генерируется из информации о базе данных. У меня также есть отдельный XMLT-файл. Мне нужно использовать VB.NET для вставки XSL-ссылки в XML-документ. Я получаю его вставленным, но он вставляет неправильное место. Мне нужно это в заголовке, но он помещает его после корневого узла.Добавить инструкцию обработки xml-stylesheet непосредственно перед корневым элементом

Вот код, я использую для вставки инструкции обработки 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, поэтому, если кто-то откроет X ML, он появляется в браузере, используя отправленный с ним XSLT-файл.

ответ

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) 
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) 
Смежные вопросы