使XSLT语言独立

时间:2009-09-03 07:39:58

标签: c# .net xslt

在我的Web应用程序中,我使用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>

是否可以从资源文件中选择文本"There are no blog posts to display."

2 个答案:

答案 0 :(得分:6)

我假设“资源文件”是指编译到程序集中的常规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);
}

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

答案 1 :(得分:2)

您可以使用document()功能从外部文件加载资源:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" indent="yes"/>

    <xsl:template match="@* | node()">
      <html>
        <head>
          <title>Test</title>
        </head>
        <body>
          <p>
            <xsl:value-of select="document('resources.xml')/items/item[@id = 'no_posts']"/>
          </p>
        </body>
      </html>
    </xsl:template>

XML资源文件:

<?xml version="1.0" encoding="utf-8"?>
<items>
  <item id="no_posts">There are no blog posts to display.</item>
</items>
</xsl:stylesheet>