Поиск альтернативы XSLT для отключения-выхода-экранирования - PullRequest
0 голосов
/ 05 января 2019

«отключение-выход-экранирование» не поддерживается в Firefox, я ищу другой способ XSLT для обработки следующего XML-файла

<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<text>
<title>Any title</title>
<para>First para</para>
<para>Second para</para>
<para>Third para</para>
</text>

для создания HTML-файла есть поле

(с синей рамкой) вокруг содержимого всех тегов . «Плохое» решение с использованием «disable-output-escaping» -
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">

    <html>
    <head>
    </head>
    <body>
    <xsl:apply-templates/>
    <xsl:text disable-output-escaping="yes">&lt;/div></xsl:text>
    </body>
    </html>
</xsl:template>

<xsl:template match="title">
    <div style="border: 3px solid red;">
        <h1><xsl:value-of select="."/></h1>
    </div>
    <xsl:text disable-output-escaping="yes">&lt;div style="border: 3px solid blue></xsl:text>
</xsl:template>

<xsl:template match="para">
    <div style="border: 3px solid green;">
        <xsl:value-of select="."/>
    </div>
</xsl:template>

</xsl:stylesheet>

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Я не вижу, как применить шаблоны ко всем другим типам узлов

Все просто:

<xsl:apply-templates select="*[not(self::title)]"/>

То есть создайте свой первый шаблон:

<xsl:template match="/text">
    <html>
        <head/>
        <body>
            <xsl:apply-templates select="title"/>
            <div style="border: 3px solid blue;">
                <xsl:apply-templates select="*[not(self::title)]"/>
            </div>
        </body>
    </html>
</xsl:template>

затем добавьте шаблоны для обработки title, para, image и любого другого узла, который может появиться на входе.


В качестве альтернативы, если у вас есть список всех узлов, которые могут появиться во входных данных, примените к ним шаблоны явно:

<xsl:template match="/text">
    <html>
        <head/>
        <body>
            <xsl:apply-templates select="title"/>
            <div style="border: 3px solid blue;">
                <xsl:apply-templates select="para | image | other | another"/>
            </div>
        </body>
    </html>
</xsl:template>
0 голосов
/ 05 января 2019

Это очень просто.

<xsl:template match="/">
    <html>
    <body>
    <xsl:apply-templates select="title"/>
    <div>
       <xsl:apply-templates select="para"/>
    </div>
    </body>
    </html>
</xsl:template>

Это становится сложнее, если вам нужно обработать последовательность вроде

название параграфа название параграфа название параграфа

Для этого подходящим методом в XSLT 1.0 является «рекурсия родного брата» - примените шаблоны к первому дочернему элементу, а в шаблоне для этого дочернего элемента примените шаблоны к первому последующему брату. Лучше перейдите на XSLT 2.0+ и используйте xsl:for-each-group. (В браузере для этого требуется сторонний процессор, такой как Saxon-JS).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...