Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XSLT:如何从XSL转换中输出“?_C#_.net_Xml_Xslt_Escaping - Fatal编程技术网

C# XSLT:如何从XSL转换中输出“?

C# XSLT:如何从XSL转换中输出“?,c#,.net,xml,xslt,escaping,C#,.net,Xml,Xslt,Escaping,我正在使用XSL转换从XML文档构建一些文本片段。文本可以在输出中包含字符和其他特殊字符 将以下xml指定为data.xml: 我的问题是逃逸序列&60;和62英镑;加载XSLT时: var xslDocument = XDocument.Load("transformation.xslt"); 转换后的输出并不像预期的那样带有字符,但它具有HTML转义序列 Schiff: Id: 1  Dicke Bertha  (OC:10.0000000 USD) Betriebskosten &am

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

将以下xml指定为data.xml:

我的问题是逃逸序列&60;和62英镑;加载XSLT时:

var xslDocument = XDocument.Load("transformation.xslt");
转换后的输出并不像预期的那样带有字符,但它具有HTML转义序列

Schiff:  Id: 1  Dicke Bertha  (OC:10.0000000 USD)
Betriebskosten < 500 USD oder > 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();
    }

}
在XSLT中,您可以像 我在这里加了60英镑;和62英镑

在XSLT中,您可以像 我在这里加了60英镑;和62英镑

我正在构建一些文本片段

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

XSLT

结果:

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

我正在构建一些文本片段

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

XSLT

结果:


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

太好了。是否可以更全局地禁用转义?这是only和Great的属性。是否可以更全局地禁用转义?它是only的一个属性,那么您想要哪种输出,纯文本还是XML?如果您想要纯文本,请在XSLT中使用,在C代码中不要转换为XmlWriter,而只转换为TextWriter或StringWriter,或者如果您认为需要使用XmlWriter,请使用XslCompiledInstance的xsl.OutputSettings创建它。那么您想要哪种输出,纯文本还是XML?如果需要纯文本,则在XSLT中使用,在C代码中不要转换为XmlWriter,而只转换为TextWriter或StringWriter,或者如果您认为需要使用XmlWriter,则使用xslcomiledInstance.Hmm的xsl.OutputSettings创建它。。。两次无法解释的否决了正确答案。。。我不知道我该如何看待它。可能耸耸肩然后继续。第一:我没有投反对票。但是,我得到了不同的结果。我认为关键在于如何加载XSLT。当我用XDocument加载它时,加载转义序列&60;和62英镑;将被翻译成HTML转义序列和。然后,输出将包含您使用的两种输出方法中的任何一种。因此,@pranavy提供了我问题的正确答案,您可以看到它在这里返回了预期的结果:至于在C中设置转换,我恐怕对此一无所知。我建议你听听Martin Honnen的话,他会的。在任何情况下,禁用输出转义在这里都不是正确的答案,很少是。@MiGro,无论您如何加载XSLT,尽管将XDocument用于XSLT和XslCompiledTransform一起使用在任何方面都不是必要或有用的,XslCompiledTransform的加载方法可以直接执行compiled.Loadtransformation.XSLT。重要的是你想要的输出方法。在将API用于XSLT处理器的情况下,您需要确保使用它,以便尊重xsl:output。@MiGro,如果您使用XslCompiledTransform并将其转换为自己创建的XmlWriter,则基本上覆盖xsl:output设置。因此,要么直接写入StringWriter、TextWriter或流,要么确保使用XslCompiledTransform.Hmm的格式创建XmlWriter。。。两次无法解释的否决了正确答案。。。我不知道我该如何看待它。可能耸耸肩然后继续。第一:我没有投反对票。但是,我得到了不同的结果。我认为关键在于如何加载XSLT。当我用XDocument加载它时,加载转义序列&60;和62英镑;将被翻译成HTML转义序列和。然后,输出将包含您使用的两种输出方法中的任何一种。因此,@pranavy提供了我问题的正确答案,您可以看到它在这里返回了预期的结果:至于在C中设置转换,我恐怕对此一无所知。我建议你听听Martin Honnen的话,他会的。在任何情况下,禁用输出转义在这里都不是正确的答案,很少是。@MiGro,无论您如何加载XSLT,尽管将XDocument用于XSLT和XslCompiledTransform一起使用在任何方面都不是必要或有用的,XslCompiledTransform的加载方法可以直接执行compiled.Loadtransformation.XSLT。重要的是你想要的输出方法。在将API用于XSLT处理器的情况下,您需要确保使用它,以便尊重xsl:output。@MiGro,如果您使用XslCompiledTransform并将其转换为自己创建的XmlWriter,则基本上覆盖xsl:output设置 gs。因此,要么直接写入StringWriter、TextWriter或流,要么确保使用XslCompiledTransform的格式创建XmlWriter。
Schiff:  Id: 1  Dicke Bertha  (OC:10.0000000 USD)
Betriebskosten < 500 USD oder > 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();
    }

}
<?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>
<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