繁体   English   中英

xslcompiledtransform输出函数名称和名称空间

[英]xslcompiledtransform outputs name of function and namespaces

背景:我正在开发XSLT,以将XML文档转换为rtf文档。 XSLT有一个名为GetImageString的msxsl:script函数,该函数返回给定图像文件的字符串表示形式,因此我可以将图像嵌入rtf文档中。

问题:当xslCompiledTransform与xmlWriterSettings和XmlWriter一起使用时,转换的输出(xsl:output method =“ text”)包括脚本函数的名称(GetImageString)以及列表中包含的所有非默认名称空间的列表。 XSL文件。 如果我使用不带xmlWriterSettings和XmlWriter类的XslCompiledTransform,则输出是正确的,除了在文件顶部插入BOM(字节顺序标记)之外(这至少会混淆MS Word rtf阅读器)。 因此,要限制BOM表,我必须使用XmlWritterSettings(和XmlWriter)类,但是当调用嵌入式c#代码时,输​​出是不正确的。

这是我的xsl文件的片段:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xpp="http://www.sdl.com/xpp"
    xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
    xmlns:v="urn:schemas-microsoft-com:vml"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    xmlns:rend="urn:rend-scripts">
    <xsl:output method="text" encoding="utf-8"/>

    <xsl:template match="xpp:document">          
      <xsl:text>{\rtf1\ansi {\fonttbl </xsl:text>
      <xsl:apply-templates select="//xpp:style"/>
      <xsl:text> }</xsl:text>

      <xsl:apply-templates select ="//xpp:image"/>
      <xsl:text>};</xsl:text>
    </xsl:template>

    <msxsl:script language="c#" implements-prefix="rend">
      <msxsl:assembly href="C:\Projects\LearningRTF\System.IO.dll"/>
      <msxsl:assembly href="C:\Projects\LearningRTF\System.Drawing.dll"/>
      <msxsl:using namespace="System.IO"/>
      <msxsl:using namespace="System.Drawing"/>
      <![CDATA[
        public string GetImageString(string path_to_image){
          MemoryStream stream = new MemoryStream();
          Image img = Image.FromFile(path_to_image);
          img.Save(stream, System.Drawing.Imaging.ImageFormat.Tiff);
          byte[] bytes = stream.ToArray();
          string output = BitConverter.ToString(bytes, 0).Replace("-", string.Empty);

          return output;
        }
      ]]>
    </msxsl:script>

    <xsl:template match="xpp:image">
      <xsl:text>
      {\pict\wmetafile8</xsl:text>
      <GetImageString>
        <xsl:text> </xsl:text>
        <xsl:value-of select="rend:GetImageString(@path)"/>
      </GetImageString>
      <xsl:text>}</xsl:text>
    </xsl:template>

这是调用转换的c#程序:

    public void TransformWithMS()
    {
        XsltSettings xsltConfig = new XsltSettings(false,true);

        XslCompiledTransform xslt = new XslCompiledTransform();
        xslt.Load("scratch.xsl",xsltConfig,null);
        //xslt.Transform("divxml_modified.xml", "scratch.rtf");
        XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
        xmlWriterSettings.Encoding = new UTF8Encoding(false);
        xmlWriterSettings.ConformanceLevel = ConformanceLevel.Auto;
        XmlWriter results = XmlWriter.Create("scratch.rtf", xmlWriterSettings);
        xslt.Transform("divxml_modified.xml", results);
    }

令人讨厌的输出如下所示:

{\\ rtf1 \\ ansi {\\ fonttbl {\\ f1 Times New Roman;}} {\\ pict \\ wmetafile8 GetImageString xmlns:xpp =“ http://www.sdl.com/xpp”> xmlns:w =“ http:// schemas.openxmlformats.org/wordprocessingml/2006/main“> xmlns:v =” urn:schemas-microsoft-com:vml“ xmlns:msxsl =” urn:schemas-microsoft-com:xslt“> xmlns:rend =” urn :rend-scripts“ 49492A00BC480000803 ...

(在GetImageString和namepcaes列表周围有一个<和>,但是我在弄清楚如何将其格式化为问题时遇到了麻烦)

任何人都知道如何在不输出函数名称和其他名称空间(并且没有BOM)的情况下调用msxsl:script函数吗?

如果要更改.NET代码的输出设置,则应使用

XmlWriterSettings myOutputSettings = xslt.OutputSettings.Clone();
myOutputSettings.Encoding = new UTF8Encoding(false);

现在创建一个XmlWriter例如

using (XmlWriter result = XmlWriter.Create("scratch.rtf", myOutputSettings))
{
  xslt.Transform("divxml_modified.xml", result);
}

这样一来,您就可以拥有一个XmlWriter,它根据xsl:output但编码有所更改。

我不确定是否可以解决输出中出现代码的问题,请尝试并报告。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM