我正在使用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"/>  <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>
我在加载XSLT时遇到转义序列<
和>
的问题:
var xslDocument = XDocument.Load("transformation.xslt");
转换后的输出不是 - 正如预期的那样 - 带有'&lt;'和'&gt;'字符,但它有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();
}
}
答案 0 :(得分:2)
<xsl:text disable-output-escaping="yes"><</xsl:text>
和<xsl:text disable-output-escaping="yes">></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"/>  <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>
答案 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"/>  <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
另请注意,文字文本最好放在xsl:text
指令中 - 否则您将所有不需要的周围空格传递给输出。