У меня проблемы со слиянием нескольких файлов с использованием XSL-трансформации в C #. Я последовал нескольким примерам и сообщениям с севреальских сайтов, и я так близко, но не радуюсь. Я получаю сообщение об ошибке при выполнении кода, заявляющего "Узлы пространства имен не могут быть добавлены к родительскому элементу после того, как узел атрибута уже был добавлен." .
Вот мой код
string[] filesInCurrentDir = Directory.GetFiles(dirsWithTestCases[a], "*.xml");
string[] xslFilePath = Directory.GetFiles(dirsWithTestCases[a], "*.xsl");
string[] outputPathArray = Directory.GetFiles(dirsWithTestCases[a] + "\\Expected");
var resolver = new XmlPreloadedResolver();
var inputPath = string.Empty;
for (int x = 0; x < filesInCurrentDir.Length; x++)
{
if (filesInCurrentDir[x].IndexOf(".xml") > 0)
{
// First file load into doc variable
if (inputPath == string.Empty)
{
// Load the first XML file into a document
//input.LoadXml(filesInCurrentDir[x]);
inputPath = filesInCurrentDir[x];
}
//Any and all other files
else
{
var files = new FileInfo(filesInCurrentDir[x]);
var inputStream = files.OpenRead();
resolver.Add(new Uri(filesInCurrentDir[x]), inputStream);
}
}
}
// Load the XSL
var xslt = new XslCompiledTransform(true);
var xlstFile = new FileInfo(xslFilePath[0]);
var xsltDoc = new XmlDocument();
// Load the XSLT file through XmlReader to override the base URI.
using (StreamReader reader = File.OpenText(xslFilePath[0]))
using (XmlReader xmlReader = XmlReader.Create(reader, null, xslFilePath[0]))
{
xsltDoc.Load(xmlReader);
}
// Use XsltSettings to enable the use of the document() function.
xslt.Load(xsltDoc, new XsltSettings(true, false), null);
// Define the output
var output = new FileInfo(outputPathArray[0] + ".UPDATED");
// Create input stream for first file
var inputFile = new FileInfo(inputPath);
//var inputStream = inputFile.OpenRead();
var input = new XmlDocument();
input.Load(inputPath);
// Compile stylesheet
var processor = new Processor();
var compiler = processor.NewXsltCompiler();
var executable = compiler.Compile(new Uri(xlstFile.FullName));
using (StringWriter OutputWriter = new StringWriter())
using (XmlWriter xmlWriter = XmlWriter.Create(OutputWriter))
{
// Pass the resolver to the transform
XmlWriterSettings settings = new XmlWriterSettings
{
Indent = true
};
var inputUri = new Uri(inputPath);
xslt.Transform(input, xmlWriter);
}
Ошибка в этой строке
xslt.Transform(input, xmlWriter);
Ошибка:
"Узлы пространства имен нельзя добавить к родительскому элементу после того, как узел атрибута уже был добавлен."
трассировка стека
at System.Xml.Xsl.Runtime.XmlQueryOutput.StartCopy(XPathNavigator navigator, Boolean callChk)
at System.Xml.Xsl.Runtime.XmlQueryOutput.CopyNode(XPathNavigator navigator)
at System.Xml.Xsl.Runtime.XmlQueryOutput.WriteItem(XPathItem item)
at System.Xml.Xsl.CompiledQuery.Query.<xsl:template match="*" mode="elaborate">(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime, XPathNavigator {urn:schemas-microsoft-com:xslt-debug}current, Double {urn:schemas-microsoft-com:xslt-debug}position, Double {urn:schemas-microsoft-com:xslt-debug}last, IList`1 {urn:schemas-microsoft-com:xslt-debug}namespaces)
at System.Xml.Xsl.CompiledQuery.Query.<xsl:apply-templates mode="elaborate">(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime, XPathNavigator , Double , Double )
at System.Xml.Xsl.CompiledQuery.Query.<xsl:template match="*" mode="elaborate">(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime, XPathNavigator {urn:schemas-microsoft-com:xslt-debug}current, Double {urn:schemas-microsoft-com:xslt-debug}position, Double {urn:schemas-microsoft-com:xslt-debug}last, IList`1 {urn:schemas-microsoft-com:xslt-debug}namespaces)
at System.Xml.Xsl.CompiledQuery.Query.<xsl:apply-templates mode="elaborate">(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime, XPathNavigator , Double , Double )
at System.Xml.Xsl.CompiledQuery.Query.__ARR_AddPassengerInfoToBooking(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime) in :line 0
at System.Xml.Xsl.CompiledQuery.Query.Execute(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime)
at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlSequenceWriter results)
at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlWriter writer)
at System.Xml.Xsl.XslCompiledTransform.Transform(IXPathNavigable input, XsltArgumentList arguments, XmlWriter results, XmlResolver documentResolver)
at System.Xml.Xsl.XslCompiledTransform.Transform(IXPathNavigable input, XmlWriter results)
at XSLTRegressionSuite.Program.Main(String[] args) in \XSLT.Regression.Suite\XSLTRegressionSuite\Program.cs:line 245
Любая помощь очень ценится.
Приветствия