c# - 使 XSLT 语言独立

标签 c# .net xslt

在我的网络应用程序中,我使用 XSLT 显示搜索结果。 XSLT 文件中有一些硬编码文本,我想让它们与语言无关。

XSLT:

<xsl:if test="$IsEmpty">
    <table cellpadding="5" cellspacing="0" border="1" style="width:100%;border-top-style:solid;border-bottom-style:solid;border-left-style:solid;border-right-style:solid;border-top-color:gray;border-bottom-color:gray;border-left-color:gray;border-right-color:gray;border-top-width:1px;border-bottom-width:1px;border-left-width:1px;border-right-width:1px;">
        <tr>
            <td style="text-align:center;">
                There are no blog posts to display.
            </td>
        </tr>
    </table>
</xsl:if>

是否可以从资源文件中选择文本“没有要显示的博客文章。”

最佳答案

我假设“资源文件”是指编译到程序集中的常规 resx。在这种情况下,不是直接来自 xslt;但是,您可以添加一个扩展对象并使用基于键的方法,即

<xsl:value-of select="resx:getString('noposts')"/>

“resx”别名将映射 (xmlns) 到您在 C# 中创建 xslt 包装器时使用的 uri。例如,使用 xmlns(在 xslt 序言中):

xmlns:resx="myextnuri"

我们可以通过以下方式在 C# 中映射它:

public class MyXsltExtension {
    public string getString(string key) {
        return "TODO: Read from resx: " + key;
    }
}

并将其附加到命名空间:

XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load("xslt.xslt");
XsltArgumentList args = new XsltArgumentList();
object obj = new MyXsltExtension();
args.AddExtensionObject("myextnuri", obj);
using (XmlWriter writer = XmlWriter.Create("out.xml")) {
    xslt.Transform("xml.xml", args, writer);
}

我们现在可以完全控制将托管代码(作为扩展)注入(inject)我们的 xslt。

关于c# - 使 XSLT 语言独立,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1371945/

相关文章:

c# - 序列化 C# 对象,同时维护对象引用

.net - 通过 WCF 发送 XML 是否存在问题?

javascript - Umbraco Macro Referenced Root 但在重定位后现在已损坏

xml - XPath name()函数是否用于当前元素?

c# - 如何使用 Linq 在 ASP.NET 中运行 mysql Sp

c# - 将 WCF 服务转换为 asmx

c# - 运算符重载问题

XSLT : Add a namespace declaration to the root element

c# - 如何使用tableview实例访问tableviewcell

c# - 将大型 MFC 应用程序迁移到 WPF/.NET 有哪些技术?