3

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

我知道这个字符在 XML 文档中是不允许的,但是我要输出文本,那为什么我还是不允许使用它呢?

我也明白不可能将这个字符按字面意思放入模板中,无论是在CDATAsection 中还是 as 中&#16;。但是为什么即时生成也不起作用呢?例如,我尝试定义一个返回此字符并将其用作<xsl:value-of select="z:get_char(16)"/>但也会产生无效字符异常的函数。

有办法吗?

4

4 回答 4

4

由于 XSLT 文件是 XML 文件,因此不能包含该字符引用。我认为您不能在纯 XSLT 解决方案中做到这一点。

ASCII 字符 HEX 10/DEC 16 是数据链路转义 (DLE)控制字符

XML 规范只允许三个空格(制表符、回车、换行)控制字符

合法字符包括制表符、回车、换行以及 Unicode 和 ISO/IEC 10646 的合法字符。

不允许 0x20 下的所有其他内容。

字符范围2 个 字符 ::=
#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* 任何 Unicode 字符,不包括代理块、FFFE 和 FFFF。*/

一种选择是在输出中为该字符放置一个占位符标记值,然后使用外部进程查找/替换该字符的标记。

于 2010-02-11T12:46:32.440 回答
4

Microsoft .NET 框架不支持 XML 1.1,这是真的,但它有自己的(不可移植的)方式来使用 XML 1.0 文档中的控制字符,也就是说,如果您将 CheckCharacters 设置为 false on,您可以将其作为数字字符引用你的 XmlReaderSettings/XmlWriterSettings。

这是一个示例样式表和一些使用 .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();
}
于 2010-02-16T11:36:16.177 回答
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>
于 2010-02-12T17:37:51.493 回答
0

过去,我曾使用这种技术将换行符输入到 XHTML 生成的文本区域中。如果我没有输入至少一个字符,textarea 会自动关闭(导致浏览器问题)。注意字符被包裹在<xsl:text>. 此外,原始源代码在一行中,但为了便于阅读,我进行了格式化。

<textarea name="qry" rows="4" cols="50" id="query">
 <xsl:value-of select="$qry" /><xsl:text>&#x0A;</xsl:text>
</textarea>
于 2010-02-11T13:25:31.477 回答