如何使用 C# 将 XSLT 更改为使用动态 XPath?

Posted

技术标签:

【中文标题】如何使用 C# 将 XSLT 更改为使用动态 XPath?【英文标题】:How can I change XSLT to using dynamic XPath using C#? 【发布时间】: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“匹配”以满足特定选择。

【问题讨论】:

【参考方案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 处理器是否属于这种情况。

【讨论】:

以上是关于如何使用 C# 将 XSLT 更改为使用动态 XPath?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用“no-cors”将 JavaScript HTTP 发布请求代码更改为 C#?

Swig:如何将生成的 C# 类的可访问性从“公共类”更改为“内部类”

如何在 C# 中以编程方式将 Windows 服务的启动类型更改为禁用

jquery tokenInput如何将ajax调用url动态更改为脚本

C#如何将COM端口更改为指定的端口

Flutter 响应式设计:如果屏幕更大,动态将 Column 更改为 Row