我一直在努力解决以下问题:
- 我想将XML从C#传递到嵌入在XSL文件中的VBS脚本(完成 - 我将其作为字符串发送),
- 将此XML传递给XSL标记<xsl:for-each>
- 迭代此XML的所有子元素
C#:
namespace EcodMappingUtils
{
[ComVisible(true)]
[Transaction(TransactionOption.RequiresNew)]
[assembly: ApplicationName("EcodMappingUtilsProxy")]
[assembly: ApplicationActivation(ActivationOption.Library)]
public class Proxy : ServicedComponent
{
public object CatalogGet(string p_SrcAliasValue, string p_DestAliasValue, string p_BusinessType_Type)
{
return "<?xml version='1.0' encoding='UTF-8' standalone='yes'?><root><b1><content>abc</content></b1> <b2><content>def</content></b2></root>";
}
}
}
xsl中的vbs:
<msxsl:script language="VBScript" implements-prefix="user">
Function CatalogGet(p_SrcAliasValue, p_DestAliasValue, p_BusinessType_Type)
Dim obj
obj = CreateObject("EcodMappingUtils.Proxy")
CatalogGet = obj.CatalogGet(p_SrcAliasValue, p_DestAliasValue, p_BusinessType_Type)
End Function
</msxml:script>
当我尝试迭代这个XML时:
<xsl:for-each select="user:CatalogGet('', '', '')">
</xsl:for-each>
我收到一个错误,表达式必须返回一组节点。 我试图在VBS中将字符串转换为XMLDOM.Document,但是在从COM对象转换为CLR时出现错误。
我该怎么办?
编辑:
XSL转换:
var myXslTrans = new XslCompiledTransform(true);
XsltSettings settings = new XsltSettings();
settings.EnableScript = true;
settings.EnableDocumentFunction = true;
myXslTrans.Load(@"../../test.xslt", settings, new XmlUrlResolver());
myXslTrans.Transform("../../file.xml", "../../file_out.xml");
答案 0 :(得分:1)
如果XSLT处理器是.NET的XslCompiledTransform
,那么你的“脚本”不是VBScript,而是VB.NET编译成.NET代码。您需要返回的数据类型为XPathNavigator
,例如
Dim doc As XPathDocument
Using sr As New StringReader("<root><b1><content>abc</content></b1> <b2><content>def</content></b2></root>")
doc = New XPathDocument(sr);
End Using
Return doc.CreateNavigator()
将字符串解析为XML,创建XPathDocument并返回选择根节点到XSLT / XPath的XPathNavigator。然后,您的XSLT可以使用例如<xsl:for-each select="user:CatalogGet('', '', '')//content">...</xsl:for-each>
。有关XSLT和.NET之间的类型映射的详细信息,请参阅https://msdn.microsoft.com/en-us/library/wxaw5z5e%28v=vs.110%29.aspx。