Trying to use XslTransform to validate an XSL with

2019-09-13 19:41发布

问题:

The XSL is

<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>

Using XslCompiledTransform I am able to validate this XSL easily using the following code:

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());
    }
}

But, if I am trying to use the obsolete (I have reasons to) XslTransform as below:

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());
    }
}

I get The 'msxsl:script' element cannot be empty.

Why?

回答1:

The simplest test case I could come up with uses

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

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

with the files being

<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>

and

<test>foo</test>

compiles and runs fine, output file is FOO. According to the documentation, msxsl:script is supported, msxsl:using however is not mentioned, so try to remove that.



标签: .net xslt