Проблема с амперсандом в выводе XSLT - PullRequest
4 голосов
/ 23 октября 2009

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

Один из узлов в 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 ]

5 голосов
/ 23 октября 2009

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

3 голосов
/ 23 октября 2009

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

<a href="{root/url}">
    <xsl:value-of select="root/url" disable-output-escaping="yes" />
</a>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...