如何制作XslCompiledTransform变换& amp;正如XslTransform所做的那样 [英] How to make XslCompiledTransform transform &amps; as XslTransform does
问题描述
我们已经使用过XslTransform。 .NET 1.1,用于转换XML文档,数据集,xsl到HTML。其中一些html内容包含javascript和链接。例如:
// javascript
if(a& gt; b)
.....
// xsl内容
abc.aspx?p1 = v1& amp; p2 =< xsl:value-of select =" $ v2" />
但是,由于我们切换到用XslCompiledTransform替换XslTransform,所有这些实体类都需要包含在xsl:text中,并带有DOE
< xsl:text disable-output-escaping =" yes">
来自XslTransform的结果
if(ab)
....
abc.aspx?p1 = v1& p2 = ...
来自XslCompiledTransform的结果,不包含在xsl:text中而不包含doe
if(a& gt; b)
....
abc.aspx?p1 = v1& amp; p2 = .. 。
在我们的实现中,所有XML内容都被转换为XpathDocument,而xsl文件的输出方法被设置为html。我尝试使用1- StringWriter,2- XmlWritter,3- MemoryStream(见下文),我们从这三种方法得到了相同的结果
我们有办法吗?可以使XslCompiledTransform处理那些实体类,例如& amp;,& gt;,& lt; ,作为XslTransform
//使用StringWriter版本
public static string Transform(System.Xml.XPath.XPathNavigator nav,string xslPath,Hashtable htArguments,XmlResolver resolver)
{
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
XslCompiledTransform xt = PrepareCompiledTransform(xslPath,resolver);
xt.Transform(nav,PrepareXsltArgumentList(htArguments),sw);
sw.Close();
xt = null;
返回sb.ToString();
}
//使用xml编写器
public static string Transform(System.Xml.XPath.XPathNavigator nav,string xslPath,Hashtable htArguments,XmlResolver resolver)
{
StringBuilder sb = new StringBuilder( );;
StringWriter sw = new StringWriter(sb);
XslCompiledTransform xt = PrepareCompiledTransform(xslPath,resolver);
XmlWriterSettings settings = xt.OutputSett ings.Clone();
settings.CheckCharacters = false;
settings.CloseOutput = true;
XmlWriter xw = XmlWriter.Create(sb ,设置);
xt.Transform(nav,PrepareXsltArgumentList(htArguments),xw);
xw.Close();
sw。关闭();
返回sb.ToString();
}
//使用内存流
public static string Transform(System.Xml.XPath.XPathNavigator nav,string xslPath,Hashtable htArguments,XmlResolver resolver)
{
//使用memroystream
MemoryStream mry = new MemoryStream();
StreamReader sr = new StreamReader(mry,System.Text.UTF8Encoding.UTF8);
XslCompiledTransform xt = PrepareCompiledTransform (xslPath,resolver);
xt.Transform(nav,PrepareXsltArgumentList(htArguments),mry);
mry.Position = 0;
string s = sr.ReadToEnd();
sr.Close();
返回s;
}
私有静态X. slCompiledTransform PrepareCompiledTransform(字符串xslPath,XmlResolver stylesheetResolver)
{
bool bEnableDebug = false;
XslCompiledTransform xt = new XslCompiledTransform(bEnableDebug);
XsltSettings settings = new XsltSettings();
settings.EnableDocumentFunction = true;
XmlResolver theResolver =(stylesheetResolver == null? new XmlUrlResolver():stylesheetResolver);
xt.Load(GetXmlFilePath(xslPath),settings,theResolver);
返回xt;
}
We have been used XslTransform. .NET 1.1, for transform XML document, Dataset with xsl to HTML. Some of these html contents contain javascript and links. For example:
// javascript
if (a > b)
.....
// xsl contents
abc.aspx?p1=v1&p2=<xsl:value-of select="$v2" />
However, since we switched to replace XslTransform with XslCompiledTransform, all these entity classes need to be wrapped within xsl:text with DOE
<xsl:text disable-output-escaping="yes">
Results from XslTransform
if (a b)
....
abc.aspx?p1=v1&p2=...
Results from XslCompiledTransform without be wrapped within xsl:text without doe
if (a > b)
....
abc.aspx?p1=v1&p2=...
In our implementations, all the XML contents were "converted into XpathDocument, and the output method of xsl file is set to "html" and I have tried to use 1- StringWriter, 2- XmlWritter, 3- MemoryStream (see below), and we got the same results from all three approaches
Is there a way that we can make the XslCompiledTransform handle those entity classes, e.g. &, >, < , as XslTransform
// using StringWriter version
public static string Transform(System.Xml.XPath.XPathNavigator nav, string xslPath, Hashtable htArguments, XmlResolver resolver )
{
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
XslCompiledTransform xt = PrepareCompiledTransform(xslPath, resolver);
xt.Transform(nav, PrepareXsltArgumentList(htArguments), sw);
sw.Close();
xt = null;
return sb.ToString();
}
// using xml writer
public static string Transform(System.Xml.XPath.XPathNavigator nav, string xslPath, Hashtable htArguments, XmlResolver resolver )
{
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
XslCompiledTransform xt = PrepareCompiledTransform(xslPath, resolver);
XmlWriterSettings settings = xt.OutputSettings.Clone();
settings.CheckCharacters = false;
settings.CloseOutput = true;
XmlWriter xw = XmlWriter.Create(sb, settings);
xt.Transform(nav, PrepareXsltArgumentList(htArguments), xw);
xw.Close();
sw.Close();
return sb.ToString();
}
// using memory stream
public static string Transform(System.Xml.XPath.XPathNavigator nav, string xslPath, Hashtable htArguments, XmlResolver resolver )
{
// use memroystream
MemoryStream mry = new MemoryStream();
StreamReader sr = new StreamReader(mry, System.Text.UTF8Encoding.UTF8);
XslCompiledTransform xt = PrepareCompiledTransform(xslPath, resolver);
xt.Transform(nav, PrepareXsltArgumentList(htArguments), mry);
mry.Position = 0;
string s = sr.ReadToEnd();
sr.Close();
return s;
}
private static XslCompiledTransform PrepareCompiledTransform(string xslPath, XmlResolver stylesheetResolver )
{
bool bEnableDebug = false;
XslCompiledTransform xt = new XslCompiledTransform(bEnableDebug);
XsltSettings settings = new XsltSettings();
settings.EnableDocumentFunction = true;
XmlResolver theResolver = (stylesheetResolver == null ? new XmlUrlResolver() : stylesheetResolver);
xt.Load(GetXmlFilePath(xslPath), settings, theResolver);
return xt;
}
推荐答案
v2" />
但是,由于我们切换到用XslCompiledTransform替换XslTransform,所有这些实体类都需要包含在xsl:text中,并带有DOE
< xsl:text disable-output-escaping =" yes">
来自XslTransform的结果
if(ab)
....
abc.aspx?p1 = v1& p2 = ...
来自XslCompiledTransform的结果,不包含在xsl:text中而不包含doe
if(a& gt; b)
....
abc.aspx?p1 = v1& amp; p2 = .. 。
在我们的实现中,所有XML内容都被转换为XpathDocument,而xsl文件的输出方法被设置为html。我尝试使用1- StringWriter,2- XmlWritter,3- MemoryStream(见下文),我们从这三种方法得到了相同的结果
我们有办法吗?可以使XslCompiledTransform处理那些实体类,例如& amp;,& gt;,& lt; ,作为XslTransform
//使用StringWriter版本
public static string Transform(System.Xml.XPath.XPathNavigator nav,string xslPath,Hashtable htArguments,XmlResolver resolver)
{
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
XslCompiledTransform xt = PrepareCompiledTransform(xslPath,resolver);
xt.Transform(nav,PrepareXsltArgumentList(htArguments),sw);
sw.Close();
xt = null;
返回sb.ToString();
}
//使用xml编写器
public static string Transform(System.Xml.XPath.XPathNavigator nav,string xslPath,Hashtable htArguments,XmlResolver resolver)
{
StringBuilder sb = new StringBuilder( );;
StringWriter sw = new StringWriter(sb);
XslCompiledTransform xt = PrepareCompiledTransform(xslPath,resolver);
XmlWriterSettings settings = xt.OutputSett ings.Clone();
settings.CheckCharacters = false;
settings.CloseOutput = true;
XmlWriter xw = XmlWriter.Create(sb ,设置);
xt.Transform(nav,PrepareXsltArgumentList(htArguments),xw);
xw.Close();
sw。关闭();
返回sb.ToString();
}
//使用内存流
public static string Transform(System.Xml.XPath.XPathNavigator nav,string xslPath,Hashtable htArguments,XmlResolver resolver)
{
//使用memroystream
MemoryStream mry = new MemoryStream();
StreamReader sr = new StreamReader(mry,System.Text.UTF8Encoding.UTF8);
XslCompiledTransform xt = PrepareCompiledTransform (xslPath,resolver);
xt.Transform(nav,PrepareXsltArgumentList(htArguments),mry);
mry.Position = 0;
string s = sr.ReadToEnd();
sr.Close();
返回s;
}
私有静态X. slCompiledTransform PrepareCompiledTransform(字符串xslPath,XmlResolver stylesheetResolver)
{
bool bEnableDebug = false;
XslCompiledTransform xt = new XslCompiledTransform(bEnableDebug);
XsltSettings settings = new XsltSettings();
settings.EnableDocumentFunction = true;
XmlResolver theResolver =(stylesheetResolver == null? new XmlUrlResolver():stylesheetResolver);
xt.Load(GetXmlFilePath(xslPath),settings,theResolver);
返回xt;
}
v2" />
However, since we switched to replace XslTransform with XslCompiledTransform, all these entity classes need to be wrapped within xsl:text with DOE
<xsl:text disable-output-escaping="yes">
Results from XslTransform
if (a b)
....
abc.aspx?p1=v1&p2=...
Results from XslCompiledTransform without be wrapped within xsl:text without doe
if (a > b)
....
abc.aspx?p1=v1&p2=...
In our implementations, all the XML contents were "converted into XpathDocument, and the output method of xsl file is set to "html" and I have tried to use 1- StringWriter, 2- XmlWritter, 3- MemoryStream (see below), and we got the same results from all three approaches
Is there a way that we can make the XslCompiledTransform handle those entity classes, e.g. &, >, < , as XslTransform
// using StringWriter version
public static string Transform(System.Xml.XPath.XPathNavigator nav, string xslPath, Hashtable htArguments, XmlResolver resolver )
{
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
XslCompiledTransform xt = PrepareCompiledTransform(xslPath, resolver);
xt.Transform(nav, PrepareXsltArgumentList(htArguments), sw);
sw.Close();
xt = null;
return sb.ToString();
}
// using xml writer
public static string Transform(System.Xml.XPath.XPathNavigator nav, string xslPath, Hashtable htArguments, XmlResolver resolver )
{
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
XslCompiledTransform xt = PrepareCompiledTransform(xslPath, resolver);
XmlWriterSettings settings = xt.OutputSettings.Clone();
settings.CheckCharacters = false;
settings.CloseOutput = true;
XmlWriter xw = XmlWriter.Create(sb, settings);
xt.Transform(nav, PrepareXsltArgumentList(htArguments), xw);
xw.Close();
sw.Close();
return sb.ToString();
}
// using memory stream
public static string Transform(System.Xml.XPath.XPathNavigator nav, string xslPath, Hashtable htArguments, XmlResolver resolver )
{
// use memroystream
MemoryStream mry = new MemoryStream();
StreamReader sr = new StreamReader(mry, System.Text.UTF8Encoding.UTF8);
XslCompiledTransform xt = PrepareCompiledTransform(xslPath, resolver);
xt.Transform(nav, PrepareXsltArgumentList(htArguments), mry);
mry.Position = 0;
string s = sr.ReadToEnd();
sr.Close();
return s;
}
private static XslCompiledTransform PrepareCompiledTransform(string xslPath, XmlResolver stylesheetResolver )
{
bool bEnableDebug = false;
XslCompiledTransform xt = new XslCompiledTransform(bEnableDebug);
XsltSettings settings = new XsltSettings();
settings.EnableDocumentFunction = true;
XmlResolver theResolver = (stylesheetResolver == null ? new XmlUrlResolver() : stylesheetResolver);
xt.Load(GetXmlFilePath(xslPath), settings, theResolver);
return xt;
}
禁用输出转义处于灰色区域
来自XSLT 1.0规范 http: //www.w3.org/TR/xslt#disable-output-escaping:
"因为禁用输出转义可能不适用于所有XSLT处理器和
可能导致格式不正确的XML,只有在没有其他选择时才能使用它。
因此,XSLT处理器不需要支持doe。
在这种情况下,您可以尝试使用StreamWriter写出结果。
请查看以下链接,了解有关此问题的更多信息。
http://msdn2.microsoft.com/en-us/lib...k9(VS.80).aspx
< a href =http://www.thescripts.com/forum/thread534528.htmltarget =_ blank> http://www.thescripts.com/forum/thread534528.html
< a rel =nofollowhref =http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=272483&SiteID=1target =_ blank> http://forums.microsoft.com/MSDN /Sho...72483&SiteID=1
Kevin Yu
Microsoft在线社区支持
================================================ ==
通过电子邮件收到我的帖子通知?请参阅
http://msdn.microsoft .com / subscripti ... ult.aspx#notif
ications。
注意:MSDN托管新闻组支持服务适用于非紧急问题
,可以在1个工作日内收到社区或Microsoft支持工程师的初步回复。请注意,每个跟随
的响应可能需要大约2个工作日作为支持
专业人士与您合作可能需要进一步调查才能达到
最有效的分辨率。该产品不适用于需要紧急,实时或基于电话的交互或复杂的b $ b项目分析和转储分析问题的情况。这种性质的问题最好通过联系
Microsoft客户支持服务(CSS)处理
href =http://msdn.microsoft.com/subscriptions/support/default.aspx\"target =_ blank> http://msdn.microsoft.com/subscripti...t/default.aspx 。
======================================== ==========
(此帖子按原样提供,不作任何保证,并且不授予
权利。 )
Hi,
The disable-output-escaping is in a gray area
From the XSLT 1.0 Spec http://www.w3.org/TR/xslt#disable-output-escaping:
"Since disabling output escaping may not work with all XSLT processors and
can result in XML that is not well-formed, it should be used only when there
is no alternative."
So an XSLT processor is not required to support d-o-e.
In this case, you can try to use a StreamWriter to write out the results.
Please check the following links for more information about this issue.
http://msdn2.microsoft.com/en-us/lib...k9(VS.80).aspx
http://www.thescripts.com/forum/thread534528.html
http://forums.microsoft.com/MSDN/Sho...72483&SiteID=1
Kevin Yu
Microsoft Online Community Support
==================================================
Get notification to my posts through email? Please refer to
http://msdn.microsoft.com/subscripti...ult.aspx#notif
ications.
Note: The MSDN Managed Newsgroup support offering is for non-urgent issues
where an initial response from the community or a Microsoft Support
Engineer within 1 business day is acceptable. Please note that each follow
up response may take approximately 2 business days as the support
professional working with you may need further investigation to reach the
most efficient resolution. The offering is not appropriate for situations
that require urgent, real-time or phone-based interactions or complex
project analysis and dump analysis issues. Issues of this nature are best
handled working with a dedicated Microsoft Support Engineer by contacting
Microsoft Customer Support Services (CSS) at
http://msdn.microsoft.com/subscripti...t/default.aspx.
==================================================
(This posting is provided "AS IS", with no warranties, and confers no
rights.)
InvalidLastName写道:
InvalidLastName wrote:
我们已经使用过XslTransform。 .NET 1.1,用于转换XML文档,
数据集,xsl为HTML。其中一些html内容包含javascript
和链接。例如:
// javascript
if(a& gt; b)
We have been used XslTransform. .NET 1.1, for transform XML document,
Dataset with xsl to HTML. Some of these html contents contain javascript
and links. For example:
// javascript
if (a > b)
脚本应该没有逃脱。只需确保输出HTML -
set< xsl:output method =" html"并输出到Stream或TextWriter。
Script should go out with no escaping. Just make sure you output HTML -
set <xsl:output method="html"and output into Stream or TextWriter.
// xsl内容
abc.aspx?p1 = v1& amp; p2 =< xsl:value-of select ="
// xsl contents
abc.aspx?p1=v1&p2=<xsl:value-of select="
这篇关于如何制作XslCompiledTransform变换& amp;正如XslTransform所做的那样的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!