Необходимо создать отдельный режим для одного и того же шаблона, используя значение атрибута

Мне нужны два типа вывода с использованием одного XSL, в зависимости от значения корневого атрибута Input:

My Input первый тип xml (редкий случай) будет:

<topic outputclass = "inter">
       <title class = "- topic/title "/>
       <body class = "- topic/body ">
              <bodydiv class = "- topic/bodydiv ">
                     <xref class = "- topic/xref " format = "html" href = "inter.html" scope = "external"/>
              </bodydiv>
       </body>
</topic>

Inner.html, который упоминается в атрибуте href, учитывая:

<html>
    <head/>
    <body>
        <p>this is a new</p>
    </body>
</html>

Мой второй тип xml (обычный) будет:

<topic outputclass = "outer">
       <title class = "- topic/title "/>
       <body class = "- topic/body ">
              <bodydiv class = "- topic/bodydiv ">
                    <xref class = "- topic/xref " href = "123.png" />
              </bodydiv>
       </body>
</topic>

XSL, который я пробовал:

<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
    xmlns:xs = "http://www.w3.org/2001/XMLSchema" xmlns:xd = "http://www.oxygenxml.com/ns/doc/xsl"
    xmlns:r = "http://www.Corecms.com/Core/ns/metadata" xmlns:exsl = "http://exslt.org/common"
    xmlns:xhtml = "http://www.w3.org/1999/xhtml" xmlns = "http://www.w3.org/1999/xhtml"
    xmlns:ditaarch = "http://dita.oasis-open.org/architecture/2005/"
    xmlns:df = "http://dita2indesign.org/dita/functions"
    exclude-result-prefixes = "xs xd r exsl xhtml ditaarch df" version = "2.0">

    <xsl:output method = "xml" indent = "yes"/>

    <xsl:param name = "doctypePublic" select = "'public'" as = "xs:string?"/>
    <xsl:param name = "doctypeSystem" select = "'system'" as = "xs:string?"/>

    <xsl:param name = "Core.sessionkey" as = "xs:string" select = "'unset'"/>
    <xsl:param name = "Core.serverurl" as = "xs:string" select = "'urn:unset:/dev/null'"/>

    <xsl:variable name = "debug" select = "'yes'" as = "xs:string?"/>

    <xsl:function name = "df:class" as = "xs:boolean">
        <xsl:param name = "elem" as = "element()"/>
        <xsl:param name = "classSpec" as = "xs:string"/>

        <xsl:variable name = "normalizedClassSpec" as = "xs:string" select = "normalize-space($classSpec)"/>
        <xsl:variable name = "result"
            select = "matches($elem/@class, concat(' ', $normalizedClassSpec, ' | ', $normalizedClassSpec, '$'))"
            as = "xs:boolean"/>

        <xsl:sequence select = "$result"/>
    </xsl:function>

    <xsl:template match = "/">
        <xsl:variable name = "html">
            <xsl:apply-templates/>
        </xsl:variable>
        <xsl:copy-of select = "$html"/>
    </xsl:template>

    <xsl:template match = "*[df:class(., 'topic/topic')]">
        <div>
            <xsl:apply-templates select = "@*"/>
            <xsl:apply-templates/>
            <xsl:choose>
                <xsl:when test = "not(ancestor::*[df:class(., 'topic/topic')])">
                    <xsl:apply-templates select = "." mode = "generate-comments"/>
                    </xsl:when>
            </xsl:choose>
        </div>
    </xsl:template>

    <xsl:template match = "*[df:class(., 'topic/title')][parent::*[df:class(., 'topic/topic')]]">
        <xsl:variable name = "headingLevel" select = "count(ancestor::*[df:class(., 'topic/topic')])"
            as = "xs:integer"/>
        <xsl:element name = "h{$headingLevel}">
            <xsl:apply-templates select = "@*"/>
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>

    <xsl:template match = "*[df:class(., 'topic/body')]">
        <div>
            <xsl:apply-templates select = "@*"/>
            <xsl:apply-templates/>
        </div>
    </xsl:template>

    <xsl:template match = "*[df:class(., 'topic/bodydiv')]">
        <div>
            <xsl:apply-templates select = "@*"/>
            <xsl:apply-templates/>
        </div>
    </xsl:template>

    <xsl:template match = "*[df:class(., 'topic/p')]">
        <p>
            <xsl:apply-templates select = "@*"/>
            <xsl:apply-templates/>
        </p>
    </xsl:template>

    <xsl:template match = "*[df:class(., 'topic/xref')]">
        <xsl:choose>
            <xsl:when test = ". != ''">
                <a>
                    <xsl:apply-templates select = "@*"/>
                    <xsl:apply-templates/>
                </a>
            </xsl:when>
            <xsl:otherwise>
                <a>
                    <xsl:apply-templates select = "@*"/>
                </a>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

</xsl:stylesheet>

Ожидаемый результат для первого типа xml:

<div>
    <html>
        <head/>
        <body>
            <p>this is a new</p>
        </body>
    </html>
</div>

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

<xsl:template match = "*[df:class(., 'topic/xref')]">
      <div>
        <xsl:copy-of select = "document(@href)"/>
      </div>
    </xsl:template>

Но для второго типа xml (outputclass = "outer") не работает. Я не хочу нарушать существующий файл XSL для второго типа файлов xml. Потому что это только огромный. Поэтому необходимо создать новый режим с тем же шаблоном или с помощью оператора If для шаблона xref для типов выборки html.

Я новичок в XSL. Ваша помощь будет заметна. Спасибо

Не могли бы вы объяснить, что именно «не работает»? Какой результат (или ошибку) вы получаете, и какой результат вы на самом деле ожидаете? Спасибо!

Tim C 25.04.2018 12:08

<xsl: template match = "* [df: class (., 'topic / xref')]"> не работает для второго типа xml, если я изменил шаблон с помощью документа (@href).

Aakash Kumar 25.04.2018 12:11

Да, потому что document будет работать только для чтения файлов с XML (или XHTML), но во втором XML похоже, что вы ссылаетесь на изображение. Вы хотите показать <img src = "123.png" /> в этом случае?

Tim C 25.04.2018 12:16

Спасибо, @Tim. Нет, я не хочу это изображение. в этой строке должно быть пусто. Но нужно написать шаблон, используя выходной класс темы xml только в шаблоне topic / xref.

Aakash Kumar 25.04.2018 12:21

Что произойдет, если вы замените <xsl:copy-of select = "document(@href)"/> на <xsl:copy-of select = "if (doc-available(@href)) then doc(@href) else ()"/>, и тогда вы получите желаемый результат?

Martin Honnen 25.04.2018 12:29

@MartinHonnen. Спасибо. Тогда также он начинает работать. Но я получаю вывод с <h1> и множеством элементов <div> в выводе. Мне нужен только ожидаемый результат для первого типа xml (я упомянул в вопросе). Пожалуйста, посмотри.

Aakash Kumar 25.04.2018 12:40
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
6
33
0

Другие вопросы по теме