我使用XSL将XML文档转换为.NET中的HTML。
XML中的一个节点有一个URL,应该作为HTML的HTML标记的href参数输出。当输入网址带有&符号(例如http://servers/path?par1=val1&par2=val2
)时,&符号在输出HTML中显示为&
。
有什么方法可以解决这个问题吗?问题是disable-output-escaping
吗?这不会产生一大堆其他问题吗?
这是一个重现问题及其输出的代码示例:
输出:
<html>
<body>
<a href="http://servers/path?par1=val1&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;
}
}
}
答案 0 :(得分:5)
您获得的输出是可接受的HTML 正如我刚从here学到的那样,这是在HTML页面中编写URL的正确方法! 所以我认为应该有一种单独生成角色的方法,但你可能不需要(不应该)。
答案 1 :(得分:3)
当您尝试将XML写为属性值时,它始终会被编码。但是,对于文本节点,您可以使用disable-output-escaping
属性禁用该编码:
<a href="{root/url}">
<xsl:value-of select="root/url" disable-output-escaping="yes" />
</a>