2011-07-27 108 views
0

我正在使用XslCompiledTranform来转换XML/XSL。XslCompiledTransform:属性值编码不正确

这是我的测试XSL:

<span title="{./tooltip}" anattribute="{./tooltip}"> 
<xsl:value-of select="./tooltip"/> 
</span> 

你可以看到,测试我把同样的XSL值,即@tooltiptitle属性,一个未定义的属性anattribute,也可以作为文本节点。

在我的XML中,@tooltip编码为“this is a &lt;script&gt; tag”。更确切地说:值中没有HTML标签。一切都进行编码,因此&lt;&gt;

如果我改变上述我得到的结果是:

<span title="this is a <script> tag" anattribute="this is a <script> tag"> 
this is a &lt;script&gt; tag 
</span> 

为什么保持节点值的编码,为什么它的属性替代编码值?最重要的是:我该如何阻止XslCompiledTransform的行为?我希望我的属性完全按照我指定的方式,并且不进行魔术转换。

我的设置如下:

var oXSL = new XslCompiledTransform(); 
XsltSettings oXslSettings = new XsltSettings(); 
XmlUrlResolver oUriResolver = new XmlUrlResolver(); 
oXslSettings.EnableDocumentFunction = true; 
oXslSettings.EnableScript = false; 
oXSL.Load(sXslPath, oXslSettings, oUriResolver); 

回答

0

在HTML输出方法不应逃脱<字符 属性值发生。

欲了解更多信息,请阅读规格:http://www.w3.org/TR/xslt#section-HTML-Output-Method

使用<xsl:output method="xml"/>

输入XML:

<root> 
    <tooltip>this is a &lt;script&gt; tag</tooltip> 
</root> 

XSLT:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="root"> 
     <span title="{tooltip}" anattribute="{tooltip}"> 
      <xsl:value-of select="tooltip"/> 
     </span> 
    </xsl:template> 
</xsl:stylesheet> 

C#源代码:

var oXSL = new XslCompiledTransform(); 
XsltSettings oXslSettings = new XsltSettings(); 
XmlUrlResolver oUriResolver = new XmlUrlResolver(); 
oXslSettings.EnableDocumentFunction = true; 
oXslSettings.EnableScript = false; 
oXSL.Load(@"1.xslt", oXslSettings, oUriResolver);  
oXSL.Transform(@"input.xml", @"output.xml"); 

输出:

<?xml version="1.0" encoding="utf-8"?> 
<span title="this is a &lt;script&gt; tag" anattribute="this is a &lt;script&gt; tag">this is a &lt;script&gt; tag</span> 
+0

我从你的例子中看到的是,你的输出方法= “XML”。那不一样。我的方法=“html”。但是在两者中,<在属性中都是无效的。地狱是我的< and >然后来自哪里? – Krumelur

+0

我试过了。它确实是输出=“html”,它打破了它。它适用于output =“xml”。所以谢谢你的答案,但为什么? – Krumelur

+0

@Krumelur,比使用'output method =“xml”'。有什么问题? –