XSLT:如何输出'<'和'>'来自XSL转型?

时间:2017-05-24 07:27:56

标签: c# .net xml xslt escaping

我正在使用XSL转换从XML文档构建一些文本片段。文字可以包含'<'和'>' (和其他特殊字符)在输出中。

将以下xml视为data.xml

<SCH>
    <Ship Id="1" Name="Dicke Bertha" OperatingCostsDay="10.0000000" currency="USD" />
</SCH>

以及以下xsl为transformation.xslt

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">

  <xsl:template match="/">
    Schiff: <xsl:for-each select="SCH/Ship"> Id: <xsl:value-of select="@Id"/>&#160; <xsl:value-of select="@Name"/>&#160; (OC:<xsl:value-of select="@OperatingCostsDay"/>&#160;<xsl:value-of select="@currency"/>)
    </xsl:for-each>Betriebskosten &#60; 500 USD oder &#62; 1 Mio. USD
  </xsl:template>

</xsl:stylesheet>

我在加载XSLT时遇到转义序列&#60;&#62;的问题:

var xslDocument = XDocument.Load("transformation.xslt");

转换后的输出不是 - 正如预期的那样 - 带有'&lt;'和'&gt;'字符,但它有HTML转义序列。

Schiff:  Id: 1  Dicke Bertha  (OC:10.0000000 USD)
Betriebskosten &lt; 500 USD oder &gt; 1 Mio. USD

我可以在这做什么?

为了完整性,这是完整的代码示例:

class Program
{
    static void Main(string[] args)
    {

        var xslDocument = XDocument.Load("transformation.xslt");
        var compiled = new XslCompiledTransform();
        using (var reader = xslDocument.CreateReader())
        {
            compiled.Load(reader);
        }
        var xml = File.ReadAllText("data.xml");
        Console.WriteLine(Transform(compiled, xml));
    }

    public static string Transform(XslCompiledTransform xsl, string xml)
    {
        // allow fragments
        var writerSettings = new XmlWriterSettings { ConformanceLevel = ConformanceLevel.Auto };
        var readerSettings = new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Auto };

        var stringReader = new StringReader(xml);
        var details = new StringBuilder();
        using (var reader = XmlReader.Create(stringReader, readerSettings))
        {
            using (var writer = XmlWriter.Create(details, writerSettings))
            {
                xsl.Transform(reader, writer);
            }
        }

        return details.ToString();
    }

}

2 个答案:

答案 0 :(得分:2)

在XSLT中,你可以试试 在这里,我添加了<xsl:text disable-output-escaping="yes">&#60;</xsl:text><xsl:text disable-output-escaping="yes">&#62;</xsl:text>

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">

  <xsl:template match="/">
    Schiff: <xsl:for-each select="SCH/Ship"> Id: <xsl:value-of select="@Id"/>&#160; <xsl:value-of select="@Name"/>&#160; (OC:<xsl:value-of select="@OperatingCostsDay"/>&#160;<xsl:value-of select="@currency"/>)
    </xsl:for-each> Betriebskosten  <xsl:text disable-output-escaping="yes">&#60;</xsl:text> 500 USD oder <xsl:text disable-output-escaping="yes">&#62;</xsl:text> 1 Mio. USD
  </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:2)

  

我正在制作一些文字片段

如果要输出文字,请将输出方法设置为text。然后,您的处理器将知道不会转义以XML格式保留的字符。

<强> XSLT

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

<xsl:template match="/">
    Schiff: <xsl:for-each select="SCH/Ship"> Id: <xsl:value-of select="@Id"/>&#160; <xsl:value-of select="@Name"/>&#160; (OC:<xsl:value-of select="@OperatingCostsDay"/>&#160;<xsl:value-of select="@currency"/>)
    </xsl:for-each>Betriebskosten &#60; 500 USD oder &#62; 1 Mio. USD
</xsl:template>

</xsl:stylesheet>

<强>结果:

Schiff:  Id: 1  Dicke Bertha  (OC:10.0000000 USD)
Betriebskosten < 500 USD oder > 1 Mio. USD

另请注意,文字文本最好放在xsl:text指令中 - 否则您将所有不需要的周围空格传递给输出。