如何使用 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 服务的启动类型更改为禁用