3

XML ではなくテキストを出力する XSL テンプレートがあります。このテキストでは、特定の位置に ASCII 文字 0x10 を含める必要があります。

この文字が XML ドキュメントで許可されていないことは理解していますが、テキストを出力しようとしているのに、なぜ使用できないのでしょうか?

また、この文字を文字どおりにテンプレートに入れることはできないことも理解していCDATAます&#16;。しかし、なぜオンザフライ生成も機能しないのでしょうか? たとえば、この文字を返す関数を定義してそれを使用しようとしまし<xsl:value-of select="z:get_char(16)"/>たが、無効な文字例外も生成されます。

方法はありますか?

4

4 に答える 4

4

Microsoft.NETフレームワークはXML1.1をサポートしていません。つまり、XML 1.0ドキュメントで制御文字を使用する独自の(移植性のない)方法があります。つまり、CheckCharactersをfalseに設定すると、数値文字参照として使用できます。 XmlReaderSettings/XmlWriterSettings。

次に、スタイルシートの例と、不正な文字の例外をスローしない.NET3.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 に答える
4

Since the XSLT file is an XML file, you cannot include that character reference. I don't think you can do this in a pure XSLT solution.

The ASCII character HEX 10/DEC 16 is the Data Link Escape (DLE) control character.

The XML Spec only allows the three whitespace(tab, carriage return, line feed) control characters.

Legal characters are tab, carriage return, line feed, and the legal characters of Unicode and ISO/IEC 10646.

Everything else under 0x20 is not allowed.

Character Range 2 Char ::=
#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */

One option is to put a placeholder token value for that character in your output, and then use an external process to find/replace your token with the character.

于 2010-02-11T12:46:32.440 に答える
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 で生成されたテキスト領域に改行を入力しました。少なくとも 1 文字を入力しないと、テキストエリアが自動的に閉じてしまいます (ブラウザーの問題が発生します)。文字が で囲まれていることに注意してください<xsl:text>。また、元のソースは 1 行でしたが、読みやすいようにフォーマットしました。

<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 に答える