我需要使用单个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>
在href属性中提到的Inner.html考虑:
<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”)不起作用。我不想打扰第二种类型的xml文件的现有XSL文件。因为只有huge.So需要使用相同模板创建新模式或使用If语句为xref模板获取html提取类型。
我是XSL的新手。你的帮助会很明显。感谢