C# XSLT:如何从XSL转换中输出“?
我正在使用XSL转换从XML文档构建一些文本片段。文本可以在输出中包含字符和其他特殊字符 将以下xml指定为data.xml: 我的问题是逃逸序列&60;和62英镑;加载XSLT时: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
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"/>  <xsl:value-of select="@Name"/>  (OC:<xsl:value-of select="@OperatingCostsDay"/> <xsl:value-of select="@currency"/>)
</xsl:for-each> Betriebskosten <xsl:text disable-output-escaping="yes"><</xsl:text> 500 USD oder <xsl:text disable-output-escaping="yes">></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"/>  <xsl:value-of select="@Name"/>  (OC:<xsl:value-of select="@OperatingCostsDay"/> <xsl:value-of select="@currency"/>)
</xsl:for-each>Betriebskosten < 500 USD oder > 1 Mio. USD
</xsl:template>
</xsl:stylesheet>
Schiff: Id: 1 Dicke Bertha (OC:10.0000000 USD)
Betriebskosten < 500 USD oder > 1 Mio. USD