【问题标题】:Transformation from XML to new XML including arguments using C# and XSLT从 XML 到新 XML 的转换,包括使用 C# 和 XSLT 的参数
【发布时间】:2013-09-17 06:48:45
【问题描述】:

我有一个 C# 控制台应用程序,它使用 XSLT 文档 Transformer.xsl 将大约 100 个 XML 文件批量转换为不同的标记。这些 XML 文件中的每一个都包含一个主题层次结构,这些主题层次结构根据文档标题及其层次位置分配了一个 ID,例如

<topic id="BSAR_1.5.2">...some content...</topic>

为此,我使用 GetFileNameWithoutExtension C# 方法获取文件名并将其用作 ID,方法是将其作为参数传递给 XSLCompliedTransform。 p>

我知道该参数在 XSL 文档中有效,因为它已经使用 Oxygen 进行了测试,并且我知道没有该参数,XSL 转换器在 C# 中运行如下。

//create XSLT complied transformer
            XslCompiledTransform xslTrans = new XslCompiledTransform();

//load in xslt
            xslTrans.Load(xslPath);string fileExtension = Path.GetFileName(xmlPath);

            string output= (pathDITA+"/DITA_"+fileExtension);

            //Add arguments for TopicID
            //XsltArgumentList argXSLT = new XsltArgumentList();
            //String fileID = Path.GetFileNameWithoutExtension(xmlPath);
            //argXSLT.AddParam("topicID","",fileID);

//convert XML document
            xslTrans.Transform(xmlPath, output);

其中 pathDITA 是应用程序中的一个变量,用于将文件输出到哪里,并且参数部分已被注释掉。

我的问题在于当想要从 XML 转换为包含参数的 XML 时使用什么 Transformer。目前使用的转换器方法是XslCompiledTransform.Transform(string URI, string ResultsFile)。我正在努力寻找一个允许在中间使用参数同时仍直接在 C# 资源库中输出到 XML 文件的版本。

简单来说,需要什么方法(或过程)来模仿

xslTrans.Transform(xmlPath,argXSLT,output);

其中XMLpathoutput都是XML文件,argsXSLT是传入的参数,因为当前版本返回类型错误.如有必要,将添加示例 XML 和 XSLT。

【问题讨论】:

    标签: c# xml xslt file-io


    【解决方案1】:

    如果您访问 MSDN,您应该会看到 Transform 方法的各种重载版本

    http://msdn.microsoft.com/en-us/library/System.Xml.Xsl.XslCompiledTransform.Transform.aspx

    所以,您应该看到虽然它允许Transform(String, String),但没有Transform(String, XSLTArgumentList, String)。例如,您可以使用 Transform(String, XsltArgumentList, XmlWriter)

        // Create the XslCompiledTransform and load the stylesheet.
        XslCompiledTransform xslt = new XslCompiledTransform();
        xslt.Load(xslPath);
    
        string fileExtension = Path.GetFileName(xmlPath);
        string output = (pathDITA+"/DITA_"+fileExtension);
    
        XsltArgumentList argXSLT = new XsltArgumentList();
        String fileID = Path.GetFileNameWithoutExtension(xmlPath);
        argXSLT.AddParam("topicID","",fileID);
    
        using (XmlWriter w = XmlWriter.Create(output))
        {
            xslt.Transform(xmlPath, argXSLT, w);
        }
    

    有关此方法的示例,请参阅http://msdn.microsoft.com/en-us/library/ms163439.aspx

    【讨论】:

    • 我建议使用XmlWriter w = XmlWriter.Create(output, xslt.OutputSettings)Transform(string, string) 具有相同的行为,其中XSLT 处理器根据XSLT 代码中的xsl:output 指令进行序列化。
    • 感谢@MartinHonnen,仅使用 XmlWriter 会引发异常,但您的添加解决了该问题。
    猜你喜欢
    • 1970-01-01
    • 2017-06-02
    • 2017-07-02
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多