XSL:当method =“text”时包含一些ASCII控制字符

时间:2010-02-11 10:33:35

标签: xslt escaping ascii xml-1.1

我有一个输出文本而不是XML的XSL模板。 在本文中,我需要在某个位置包含ASCII字符0x10。

我理解XML文档中不允许使用此字符,但我要输出文本,为什么我不允许使用它呢?

我也理解,无法在CDATA部分和&#16;内将此字符直接放入模板中。但为什么即时发电也不起作用?例如,我尝试定义一个函数,该函数返回此char并将其用作<xsl:value-of select="z:get_char(16)"/>,但也会产生无效字符异常。

有办法吗?

4 个答案:

答案 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>&#x10;</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>&#x10;</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>&#x0A;</xsl:text>
</textarea>