XSL:从VBScript获取XML对象

时间:2015-01-29 13:57:56

标签: c# xml xslt vbscript

我一直在努力解决以下问题:
- 我想将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"); 

1 个答案:

答案 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