代码之家  ›  专栏  ›  技术社区  ›  GSerg

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

  •  3
  • GSerg  · 技术社区  · 16 年前

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

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

    我也明白,这将是不可能把这个字符字面上的模板,也没有在一个 CDATA 节nor as &#16; . 但是为什么“飞的一代”也不起作用呢?例如,我试图定义一个函数来返回这个字符并将其用作 <xsl:value-of select="z:get_char(16)"/>

    有办法吗?

    4 回复  |  直到 14 年前
        1
  •  4
  •   Abel    14 年前

    Microsoft.NET framework不支持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();
    }
    
        2
  •  4
  •   Mads Hansen    16 年前

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

    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*/

    一种方法是将该字符的占位符标记值放入输出中,然后使用外部进程查找/替换该字符的标记。

        3
  •  3
  •   Martin Honnen    16 年前

    如果您可以使用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>
    
        4
  •  0
  •   Kevin Hakanson    16 年前

    在过去,我使用这种技术将linefeed输入到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>