我有一个输出文本而不是XML的XSL模板。 在本文中,我需要在某个位置包含ASCII字符0x10。
我理解XML文档中不允许使用此字符,但我要输出文本,为什么我不允许使用它呢?
我也理解,无法在CDATA
部分和
内将此字符直接放入模板中。但为什么即时发电也不起作用?例如,我尝试定义一个函数,该函数返回此char并将其用作<xsl:value-of select="z:get_char(16)"/>
,但也会产生无效字符异常。
有办法吗?
答案 0 :(得分:4)
由于XSLT文件是XML文件,因此不能包含该字符引用。我不认为你可以在纯XSLT解决方案中做到这一点。
ASCII字符HEX 10 / DEC 16是Data Link Escape (DLE) control character。
XML Spec仅允许三个空格(制表符,回车符,换行符)控制字符。
法律字符是制表符,运输 退货,换行和合法 Unicode和ISO / IEC的字符 10646
不允许使用0x20以外的所有其他内容。
字符范围2字符:: =
#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] / *任何Unicode 性格,不包括代理人 块,FFFE和FFFF。 * /
一种选择是在输出中为该字符添加占位符标记值,然后使用外部进程查找/替换包含该字符的标记。
答案 1 :(得分:3)
如果您可以使用XML 1.1(允许在XML文档中插入此类字符作为字符引用),那么以下内容应该可以使用,至少它适用于Sun Java 6和Saxon 9.2:
<?xml version="1.1" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:output method="text"/>
<xsl:template name="main">
<xsl:text></xsl:text>
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:3)
Microsoft .NET框架不支持XML 1.1,这是事实,但它有自己的(不可移植)方式在XML 1.0文档中使用控制字符,即你可以拥有?如果在XmlReaderSettings / XmlWriterSettings上将CheckCharacters设置为false,则为数字字符引用。
这是一个示例样式表和一些使用.NET 3.5测试的.NET代码,它不会抛出非法字符异常:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:text></xsl:text>
</xsl:template>
</xsl:stylesheet>
XmlReaderSettings xrs = new XmlReaderSettings();
xrs.CheckCharacters = false;
XslCompiledTransform proc = new XslCompiledTransform();
using (XmlReader xr = XmlReader.Create(@"sheet.xslt", xrs))
{
proc.Load(xr);
}
using (XmlReader xr = XmlReader.Create(new StringReader("<foo/>")))
{
XmlWriterSettings xws = proc.OutputSettings.Clone();
xws.CheckCharacters = false;
using (XmlWriter xw = XmlWriter.Create(@"result.txt", xws))
{
proc.Transform(xr, null, xw);
xw.Close();
}
xr.Close();
}
答案 3 :(得分:0)
过去,我使用此技术将换行输入到XHTML生成的textarea中。如果我没有放置至少一个字符,则textarea会自行关闭(导致浏览器问题)。请注意,该字符包含在<xsl:text>
中。此外,原始来源是一行,但我格式化可读性。
<textarea name="qry" rows="4" cols="50" id="query">
<xsl:value-of select="$qry" /><xsl:text>
</xsl:text>
</textarea>