C# 如何在运行时向XslCompiledTransform添加任意名称空间?
我试图对定时文本标记语言(TTML)文档执行一个非常简单的转换。下面是TTML文件的一个极简示例:C# 如何在运行时向XslCompiledTransform添加任意名称空间?,c#,xml,debugging,xslt,ttml,C#,Xml,Debugging,Xslt,Ttml,我试图对定时文本标记语言(TTML)文档执行一个非常简单的转换。下面是TTML文件的一个极简示例: 带换行符的一次性输入 注意文档的默认名称空间。这是我遇到的问题的关键 这是我正在使用的转换。这就是全部,非常简单 我们的数据集有数百个文档,但它们并不都具有相同的默认名称空间。但是,从上面的XSLT可以看出,转换非常简单,并且基于核心数据元素,因此名称空间的变化最终并不重要 由于XSLT文件具有显式定义的名称空间前缀(tt),因此上述XSL当前可用于某些源文件。
带换行符的一次性输入
注意文档的默认名称空间。这是我遇到的问题的关键
这是我正在使用的转换。这就是全部,非常简单
我们的数据集有数百个文档,但它们并不都具有相同的默认名称空间。但是,从上面的XSLT可以看出,转换非常简单,并且基于核心数据元素
,因此名称空间的变化最终并不重要
由于XSLT文件具有显式定义的名称空间前缀(tt
),因此上述XSL当前可用于某些源文件。但是,当遇到另一个具有不同默认名称空间的源文件时,这不起作用
因此,我需要找到一种方法,为XSLT提供一个任意的、未知的名称空间值作为已知前缀。我有可用于查找源文档默认命名空间的代码:
XPathDocument sourceDoc=新的XPathDocument(“sourcefile.xml”);
XPathNavigator sourceNav=sourceDoc.CreateNavigator();
sourceNav.MoveToFollowing(XPathNodeType.Element);
var sourceNS=sourceNav.GetNamespacesInScope(XmlNamespaceScope.ExcludeXml);
字符串defNS=sourceNS.Single(n=>n.Key==“”)。值;
这正确地给了我http://www.w3.org/2006/04/ttaf1
。然而,我似乎不知道如何处理这个值。我已经搜索和试验了很多小时,试图以某种方式提供变量名称空间的xslcomiledtransform
实例。似乎在变换本身的区域内没有任何东西可以接受它
我已尝试将XSLT文件显式加载到XmlDocument
中,以便操作名称表(在删除上述XSLT中的显式xmlns:tt=“…”
命名空间声明后):
xslcomiledtransformobjxsl=new xslcomiledtransform();
StringWriter编写器=新的StringWriter();
XPathDocument sourceDoc;
XmlDocument xslDoc=新的XmlDocument();
XPathNavigator源导航,xslNav;
XmlNamespaceManager xslNsManager;
sourceDoc=新的XPathDocument(“sourcefile.xml”);
sourceNav=sourceDoc.CreateNavigator();
sourceNav.MoveToFollowing(XPathNodeType.Element);
var sourceNS=sourceNav.GetNamespacesInScope(XmlNamespaceScope.ExcludeXml);
Load(“transform.xslt”);
xslNsManager=新的XmlNamespaceManager(xslDoc.NameTable);
xslNsManager.AddNamespace(“tt”,sourceNS.Single(n=>n.Key==”).Value);
xslNav=xslDoc.CreateNavigator();
objXsl.Load(xslNav);
Transform(sourceNav,null,writer);
这一直运行到实际的转换,在那里我得到一个xsloadexception
声明前缀“tt”没有定义。
我现在不知所措。我在搜索中找到的所有内容都讨论了将名称空间放入XSLT文档中(我已经有了这个文档,它可以很好地用于一个名称空间值)。我在MSDN文档或其他地方找不到任何解释如何动态地将名称空间定义添加到转换中的内容
有人有什么想法吗?我尝试一下,这项工作
using System;
using System.Xml.Xsl;
class Sample {
static public void Main(){
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load("transform.xslt");
xslt.Transform("sourcefile.xml", "result.txt");
}
}
我想没问题。我试过了,这个工作
using System;
using System.Xml.Xsl;
class Sample {
static public void Main(){
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load("transform.xslt");
xslt.Transform("sourcefile.xml", "result.txt");
}
}
我认为名称空间没有问题。一位同事建议我在XSL文档中添加/操作变量名称空间。我尝试使用名称表更改的方向是正确的,但没有成功。以下是我根据他的建议得出的结论:
xslcomiledtransform xslXform=new xslcomiledtransform();
StringWriter编写器=新的StringWriter();
XmlDocument xslDoc=新的XmlDocument();
XPathNavigator源导航;
sourceNav=新的XPathDocument(sourceFile).CreateNavigator();
sourceNav.MoveToFollowing(XPathNodeType.Element);
var sourceNS=sourceNav.GetNamespacesInScope(XmlNamespaceScope.ExcludeXml);
字符串ttNamespace=sourceNS.Single(n=>n.Key==“”)。值;
Load(xslFile);
xslDoc.DocumentElement.SetAttribute(“xmlns:tt”,ttNamespace);
Load(xslDoc.CreateNavigator());
Transform(sourceNav,null,writer);
这很管用,但我觉得有点不舒服。我认为核心问题是我不理解(
Xml
|XPath
)Document
类型和与它们相关联的名称表/名称空间管理器之间的关系。一位同事建议我只在XSL文档上添加/操作变量名称空间。我尝试使用名称表更改的方向是正确的,但没有成功。以下是我根据他的建议得出的结论:
xslcomiledtransform xslXform=new xslcomiledtransform();
StringWriter编写器=新的StringWriter();
XmlDocument xslDoc=新的XmlDocument();
XPathNavigator源导航;
sourceNav=新的XPathDocument(sourceFile).CreateNavigator();
sourceNav.MoveToFollowing(XPathNodeType.Element);
var sourceNS=sourceNav.GetNamespacesInScope(XmlNamespaceScope.ExcludeXml);
字符串ttNamespace=sourceNS.Single(n=>n.Key==“”)。值;
Load(xslFile);
xslDoc.DocumentElement.SetAttribute(“xmlns:tt”,ttNamespace);
Load(xslDoc.CreateNavigator());
Transform(sourceNav,null,writer);
这很管用,但我觉得有点不舒服。我认为核心问题是我不理解(
Xml
|XPath
)Document
类型和与它们相关联的名称表/名称空间管理器之间的关系。是的,基本转换适用于原始示例Xml/XSL。但是,我的观点是,源XML可能有不同的默认名称空间。因此,需要提取该名称空间