Необходимо создать отдельный режим для того же шаблона, используя значение атрибута - PullRequest
0 голосов
/ 25 апреля 2018

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

Мой тип ввода Первого 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>

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

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

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

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

...