尝试使用XslTransform通过脚本验证XSL失败

时间:2015-12-11 18:55:02

标签: .net xslt

XSL是

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    exclude-result-prefixes="msxsl"
    xmlns:cs="urn:cs">
  <msxsl:script language="C#" implements-prefix="cs">
    <msxsl:using namespace="System.IO" />
    <![CDATA[public void f(){}]]>
  </msxsl:script>

  <xsl:output method="text" />
  <xsl:template name="abc" />

</xsl:stylesheet>

使用XslCompiledTransform我可以使用以下代码轻松验证此XSL:

var xslTransform = new XslCompiledTransform();
using (var stream = new FileStream(XSL_PATH, FileMode.Open))
{
    using (var reader = XmlReader.Create(stream))
    {
        xslTransform.Load(reader, new XsltSettings(false, true),  new XmlUrlResolver());
    }
}

但是,如果我试图使用过时的(我有理由)XslTransform,如下所示:

var xslTransform = new XslTransform();
using (var stream = new FileStream(XSL_PATH, FileMode.Open))
{
    using (var reader = XmlReader.Create(stream))
    {
        xslTransform.Load(reader/*, new XsltSettings(false, true)*/,  new XmlUrlResolver());
    }
}

我得到'msxsl:script'元素不能为空。

为什么?

1 个答案:

答案 0 :(得分:0)

我可以提出的最简单的测试用例

        XslTransform proc = new XslTransform();
        proc.Load("XSLTFile1.xslt");

        proc.Transform("XMLFile1.xml", "result1.txt");

文件

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    xmlns:mf="http://example.com/mf"
    exclude-result-prefixes="msxsl mf"
>
    <xsl:output method="text" />

    <msxsl:script implements-prefix="mf" language="C#">
    public string Foo(string input) {
      return input.ToUpper();
    }
    </msxsl:script>

    <xsl:template match="test">
      <xsl:value-of select="mf:Foo(.)"/>
    </xsl:template>
</xsl:stylesheet>

<test>foo</test>

编译并运行正常,输出文件为FOO。根据文档,msxsl:script受支持,msxsl:using但未提及,因此请尝试删除它。