【问题标题】:How can I change XSLT to using dynamic XPath using C#?如何使用 C# 将 XSLT 更改为使用动态 XPath?
【发布时间】:2020-07-11 08:49:17
【问题描述】:

我正在使用 Asp.net 通过 C# 代码使用 XSLT 在 XML 中进行转换,如下所示。

    protected void Page_Load(object sender, EventArgs e)
    {
        string strXSLTFile = Server.MapPath("EmployeeXSLT.xslt");
        string strXMLFile = Server.MapPath("Employess.xml");

        XmlReader reader = XmlReader.Create(strXMLFile);

        XslCompiledTransform objXSLTransform = new XslCompiledTransform();
        objXSLTransform.Load(strXSLTFile);
        StringBuilder htmlOutput = new StringBuilder();
        TextWriter htmlWriter = new StringWriter(htmlOutput);
        objXSLTransform.Transform(reader, null, htmlWriter);
        ltRss.Text = htmlOutput.ToString();
        reader.Close();
    }

对于(Asp.net、XSLT 和 XML)的完整示例,请点击此链接 Doing XSLT Transformation in ASP.Net

现在我需要更改 XSLT 文件的 Xpath 值。我进行搜索以了解如何执行此操作。最后,我发现了两个影响 XSLT 文件的概念。但是,没有提供有关如何应用这些概念来更改 XSLT“匹配”或“for-each 选择”的示例,我需要为可变 Xpath 添加变量。

第一个: 使用所谓的Dynamic XPath Evaluation

第二个: 使用所谓的XSLT Parameters

我需要知道如何使用 C# 代码更改 XSLT“匹配”以满足特定选择。

【问题讨论】:

    标签: c# xml xslt xpath


    【解决方案1】:

    您可以使用 XPathNavigator 编译一个 xpath 表达式,然后遍历您的 c# 代码中的匹配节点。

    // Create and compile the XPathExpression
    string _xPathExpression = "/Data/Client[Id = 123]";
    XPathExpression exprXPathCompiled 
        = xmlDocInputNavigator.Compile(_xPathExpression);
    
    // Load the Stylesheet
    XsltSettings settings = new XsltSettings();
    XslCompiledTransform xsltTemplate = new XslCompiledTransform();
    xsltTemplate.Load(_stylesheetFileName, settings, new XmlUrlResolver());
    
    // Create an iterator to loop through the matching nodes
    XPathNodeIterator iterator = xmlDocInputNavigator.Select(exprXPathCompiled);
    StreamWriter fileOutput = null;
    
    while (iterator.MoveNext())
    {
        //...
    

    XPathNavigator docs

    【讨论】:

      【解决方案2】:

      如果你解释了你试图解决的问题,而不是你想用来解决它的方法,这会有所帮助。

      XSLT 样式表是一个 XML 文档,因此您始终可以使用 XSLT(使用所谓的“元样式表”)对其进行转换。

      使用 XSLT 3.0(Microsoft 不提供,但通过 Saxon 库提供给 C# 用户),您可以使用“影子属性”参数化样式表,例如

      <xsl:template _match="{$pattern}"/>
      

      其中 $pattern 是一个样式表参数,声明为

      <xsl:param name="pattern" static="yes"/>
      

      以便调用应用程序可以提供一个值。

      您当然也可以在表单的匹配模式中使用常规(运行时)参数

      <xsl:template match="*[@id=$requestedId]"/>
      

      很遗憾,XSLT 1.0 不允许在匹配模式中引用参数。一些 XSLT 1.0 处理器不强制执行此限制,但我不知道 Microsoft 处理器是否属于这种情况。

      【讨论】:

        猜你喜欢
        • 2022-01-17
        • 1970-01-01
        • 1970-01-01
        • 2021-03-27
        • 1970-01-01
        • 1970-01-01
        • 2011-06-05
        • 2017-10-22
        • 1970-01-01
        相关资源
        最近更新 更多