Чтобы расширить превосходный ответ Майкла Кея (поскольку это было слишком долго, чтобы писать в комментариях), для вашего конкретного входного XML проблема заключается в пробелах. В шаблоне соответствия /In
вы делаете это ...
<xsl:template match="/In">
<!-- Remove the 'In' element -->
<xsl:apply-templates select="node()"/>
</xsl:template>
Но, выбрав node()
, вы выбираете узлы пропусков до и после дочернего Submit
, поэтому вы получаете текстовый узел перед корневым элементом Q
, вызывающим ошибку.
Итак, что вы могли бы сделать в этом случае, это просто удалить пробел из вашего XML, добавив его в XSLT
<xsl:strip-space elements="*" />
В качестве альтернативы, вы также можете сделать это, чтобы выбрать только элементы, в отличие от других узлов (хотя это будет пропускать комментарии и инструкции по обработке)
<xsl:apply-templates select="*" />
Однако, если у вас есть несколько элементов Submit
в вашем XML, вы затем получите несколько элементов Q
в своем выводе, которые будут фрагментом, как и один корневой элемент. Если это то, что вы действительно намерены, то вы должны внести следующие изменения в ваш C # ...
using (XmlWriter w = XmlWriter.Create(@"C:\Users\tcase.BGT\Documents\NewFile.xml", xslt.OutputSettings ))
По умолчанию ConformanceLevel
- ConformanceLevel.Auto, который, я думаю, разрешает фрагменты. Добавление этого также решит вашу проблему с отступами, так как будет использовать настройки в xsl:output
.