Мне нужны два типа вывода с использованием одного 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. Ваша помощь будет заметна. Спасибо
<xsl: template match = "* [df: class (., 'topic / xref')]"> не работает для второго типа xml, если я изменил шаблон с помощью документа (@href).
Да, потому что document будет работать только для чтения файлов с XML (или XHTML), но во втором XML похоже, что вы ссылаетесь на изображение. Вы хотите показать <img src = "123.png" /> в этом случае?
Спасибо, @Tim. Нет, я не хочу это изображение. в этой строке должно быть пусто. Но нужно написать шаблон, используя выходной класс темы xml только в шаблоне topic / xref.
Что произойдет, если вы замените <xsl:copy-of select = "document(@href)"/> на <xsl:copy-of select = "if (doc-available(@href)) then doc(@href) else ()"/>, и тогда вы получите желаемый результат?
@MartinHonnen. Спасибо. Тогда также он начинает работать. Но я получаю вывод с <h1> и множеством элементов <div> в выводе. Мне нужен только ожидаемый результат для первого типа xml (я упомянул в вопросе). Пожалуйста, посмотри.






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