如何制作XslCompiledTransform变换& amp;正如XslTransform所做的那样 [英] How to make XslCompiledTransform transform &amps; as XslTransform does

查看:66
本文介绍了如何制作XslCompiledTransform变换& amp;正如XslTransform所做的那样的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们已经使用过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 &gt; b)
.....

// xsl contents
abc.aspx?p1=v1&amp;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 &gt; b)
....
abc.aspx?p1=v1&amp;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. &amp;, &gt;, &lt; , 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 &gt; b)
....
abc.aspx?p1=v1&amp;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. &amp;, &gt;, &lt; , 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 &gt; 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&amp;p2=<xsl:value-of select="


这篇关于如何制作XslCompiledTransform变换&amp; amp;正如XslTransform所做的那样的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆