背景: 我正在开发一个XSLT以将XML文档转换为rtf文档。 XSLT有一个名为GetImageString的msxsl:脚本函数,它返回给定图像文件的字符串表示形式,以便将图像嵌入到rtf文档中。xslcompiledtransform输出函数和名称空间的名称
问题: 当xslCompiledTransform使用具有xmlWriterSettings和变换的的XmlWriter输出(XSL:输出方法=“文本”)包括脚本函数(GetImageString)的名称与所有的非的列表沿包含在XSL文件中的默认名称空间。如果我使用不带xmlWriterSettings和XmlWriter类的XslCompiledTransform,则输出是正确的,除了在文件顶部插入BOM(字节顺序标记)(至少)混淆MS Word rtf阅读器。因此,为了抑制物料清单,我必须使用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 = “瓮:架构 - 微软COM:XSLT”>的xmlns:雷德= “瓮:撕裂的脚本” 49492A00BC480000803 ...
(有一个<和一个>围绕GetImageString和名称列表,但我无法弄清楚如何将其格式化为问题)
任何人都知道如何调用msxsl:脚本函数,而不输出函数名称和额外名称空间没有BOM)?
谢谢你的回答!使用'Clone'来创建XmlWriterSettings的技巧。另一个论坛上的人建议 GetImageString>标记是不必要的,通过删除这些标记,我也能够使其工作正常。 –