<xsl:character-map> XSLT

Элемент xsl:character-map определяет карту символов – набор символов, каждый из которых должен заменяться некоторой строкой. Карты символов позволяют включать нестандартные символы в значения элементов и атрибутов. Элемент <xsl:character-map> имеет много общего с объявлением XML <!ENTITY>. Используйте <xsl:character-map> вместо атрибутов disable-output-escaping элементов <xsl:text> и <xsl:value-of>, определенных в XSLT 1.0. Атрибут disable-output-escaping считается устаревшим в XSLT 2.0.

Синтаксис

XSLT 2.0 и XSLT 3.0

<xsl:character-map
    name = "qname"
    use-character-maps = "qnames">
    <!-- Содержимое: (xsl:output-character*) -->
</xsl:character-map>

Атрибуты

  • nameобязательный атрибут, задает имя символьной карты.
  • use-character-mapsнеобязательный атрибут, разделенные пробелами имена одной или нескольких карт символов, включаемых в текущую карту. Как и следовало ожидать, включение (прямое или косвенное) картой символов самой себя приводит к фатальной ошибке. Кроме того, попытка включения несуществующей карты символов тоже приводит к фатальной ошибке.

Описание и примеры

Пример

Далее определяется простой пример с парой полезных функций. Сначала мы создадим отображение, заменяющее символы табуляции (#x9) двумя пробелами; символы табуляции часто выводятся в виде серий из восьми пробелов, что может создать проблемы при выводе листингов с отступами. Затем мы определим пару графических изображений, которые должны выводиться вместо некоторых символов. Исходный код XML, который будет использоваться в этом примере:

<?xml version="1.0" encoding="utf-8"?>
<!-- special-characters.xml -->
<char-test>
    <tabs>public class HelloWorld {
    public static void main(String[] args) {
    System.out.println("Hello, World!");
    }
    }</tabs>
    <special-char>&#x2780;</special-char>
    <special-char>&#x2781;</special-char>
</char-test>

Таблица стилей заменяет символы табуляции двумя пробелами, а два специальных символа – графикой (диапазон символов Юникода от #x2780 до #x2789 состоит из заключенных в круг чисел от 1 до 10, выводимых шрифтом без засечек, т. е. от ➀ до ➉).

Таблица стилей выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<!-- character-map1.xsl -->
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" use-character-maps="sample"/>
    <xsl:character-map name="sample" use-character-maps="circles">
        <xsl:output-character character="&#x9;" string=" "/>
    </xsl:character-map>
    <xsl:character-map name="circles">
        <xsl:output-character character="&#x2780;" string="&lt;img src='images/circle1.gif'
        width='28' height='28'/&gt;"/>
        <xsl:output-character character="&#x2781;" string="&lt;img src='images/circle2.gif'
        width='28' height='28'/&gt;"/>
    </xsl:character-map>
    <xsl:template match="char-test">
        <html>
            <head>
                <title>A test of some special characters</title>
            </head>
            <body style="font-family: sans-serif; ">
                <h1>A test of some special characters</h1>
                <xsl:apply-templates select="*"/>
            </body>
        </html>
    </xsl:template>
    <xsl:template match="tabs">
        <pre style="font-sixe: 150%; font-weight: bold;">
            <xsl:value-of select="."/>
        </pre>
    </xsl:template>
    <xsl:template match="special-char">
        <p style="font-size: 200%;">
            <xsl:text>Here’s a special character: </xsl:text>
            <xsl:value-of select="."/>
        </p>
    </xsl:template>
</xsl:stylesheet>

Обратите внимание: таблица стилей просто выводит значения элементов <tabs> и <special-char>. Элемент <xsl:output> и его атрибут use-character-maps="sample" берут преобразование символов на себя. Элемент <xsl:character-map> с именем sample определяет одиночную замену, а также использует элемент <xsl:character-map> name="circles". Поставленная задача выполняется благодаря сочетанию определения карты символов и обращения ее к элементу <xsl:output>. Заметьте также, что подстановки в карте символов circles заменяют символ разметкой HTML – элементом <img>. Документ HTML выглядит так:

<html>
    <head>
        <meta http-eqiuv="Content-Type" content="text/html; charset=UTF-8">
        <title>A test of some special characters</title>
    </head>
    <body style="font-family: sans-serif;">
        <h1>A test of some special characters</h1>
        <pre style="font-size: 150%"
        Font-weight: bold;>public class HelloWorld {
        public static void main(String[] args) {
        System.out.println("Hello, World!");
        }
        }</pre>
        <p style="font-size: 200%;">
            Here's a special character:
            <img src='images/circle1.gif' width='28' height='28'/>
        </p>
        <p style="font-size: 200%;">
            Here's a special character:
            <img src='images/circle2.gif' width='28' height='28'/>
        </p>
    </body>
</html>

Элемент <xsl:character-map> часто применяется также для преобразования символа новой строки (#xA) в пару символов возврата курсора и перевода строки (#xD и #xA), но этот пример не будет наглядным. Если вам потребуется сделать подобное, элемент <xsl:output-character> должен выглядеть примерно так:

<xsl:output-character character="&#xA;" string="&#xD;&#xA;"/>

Наконец, в спецификации XSLT 2.0 приводится пример с созданием JSP (Java Server Pages). Использование угловых скобок в JSP нарушает совместимость с XML и HTML. Мы можем определить карту символов, которая выглядит примерно так:

<?xml version="1.0" encoding="utf-8"?>
<!-- character-map2.xsl -->
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" use-character-maps="jsp"/>
    <xsl:character-map name="jsp">
        <xsl:output-character character="«" string="&lt;%="/>
        <xsl:output-character character="»" string="%&gt;"/>
    </xsl:character-map>
    <xsl:template match="jsp-test">
        <html>
            <head>
                <title>A test of some special characters</title>
            </head>
            <body style="font-family: sans-serif;">
                <h1>Generating a .jsp page</h1>
                <p>Here's the value of a JSP function:
                    <xsl:apply-templates select="text()"/>
                </p>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

Для входного файла XML:

<?xml version="1.0" encoding="utf-8"?>
<!-- jsp-test.xml -->
<jsp-test>« new java.util.Date() »</jsp-test>

генерируется следующий результат:

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>A test of some special characters</title>
    </head>
    <body style="font-family: sans-serif;">
        <h1>Generating a .jsp page</h1>
        <p>Here's the value of a JSP function:
            <%= new java.util.Date() %>
        </p>
    </body>
</html>