2009-10-22 3 views
4

Я использую XSL для преобразования XML-документа в HTML в .NET.Проблема с амперсандом в выходе XSLT

Один из узлов в XML имеет URL-адрес, который должен выводиться как параметр href для HTML-тега HTML. Когда URL-адрес ввода имеет символ амперсанда (например, http://servers/path?par1=val1&par2=val2), амперсанд появляется в выходном HTML как &.

Есть ли способ решить эту проблему? Есть решение disable-output-escaping? Разве это не создало бы целую кучу других проблем?

Вот пример кода, который воспроизводит проблему и ее вывод:

Выход:

<html> 
    <body> 
    <a href="http://servers/path?par1=val1&amp;par2=val2#section1" /> 
    </body> 
</html> 

C# Код:

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.IO; 
using System.Diagnostics; 
using System.Xml; 
using System.Xml.Xsl; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      XmlDocument xmlDoc = ComposeXml(); 
      XmlDocument styleSheet = new XmlDocument(); 
      styleSheet.LoadXml(XslStyleSheet); 

      XmlTextWriter myWriter = new XmlTextWriter(Console.Out); 
      myWriter.Formatting = Formatting.Indented; 

      XslCompiledTransform myXslTrans = new XslCompiledTransform(); 
      myXslTrans.Load(styleSheet); 
      myXslTrans.Transform(xmlDoc, null, myWriter); 

      Console.ReadKey(); 
     } 

     private const string XslStyleSheet = 
@"<xsl:stylesheet version=""1.0"" 
xmlns:xsl=""http://www.w3.org/1999/XSL/Transform""> 

<xsl:template match=""/""> 
    <html> 
    <body> 
    <a> 
     <xsl:attribute name=""href""> 
      <xsl:value-of select=""root/url"" /> 
     </xsl:attribute>  
    </a> 
    </body> 
    </html> 
</xsl:template> 

</xsl:stylesheet>"; 

     static private XmlDocument ComposeXml() 
     { 
      XmlDocument doc = new XmlDocument(); 
      XmlElement rootNode = doc.CreateElement("root"); 
      doc.AppendChild(rootNode); 

      XmlElement urlNode = doc.CreateElement("url"); 
      urlNode.InnerText = "http://servers/path?par1=val1&par2=val2#section1"; 

      rootNode.AppendChild(urlNode); 

      return doc; 

     } 
    } 
} 
+2

+1 для готовых к запуску образец кода –

ответ

5

Вывод, что вы получите приемлемо HTML.
Как я только что узнал из here, это актуально. Правильный способ написания URL-адреса внутри HTML-страницы!
Так что я думаю, что должен быть способ генерации персонажа, но вам, вероятно, не нужно (не должно).

+0

Да делает много смысла в настоящее время. Это даже кажется очевидным :-) –

3

Когда вы пытаетесь написать XML как значение атрибута, он всегда кодируется. Но, для текстовых узлов, вы можете отключить эту кодировку с помощью disable-output-escaping атрибута:

<a href="{root/url}"> 
    <xsl:value-of select="root/url" disable-output-escaping="yes" /> 
</a> 
Смежные вопросы