我使用XSL将docbook文档转换为dita。转换成功,有剩余的不需要的工件。我已经摆脱了其中的一些,但我已将这些更改保存在转换后运行的另一个XSL中。我的问题是:是否有可能将其合并为一个XSL?当我尝试在docbook2dita.xsl之后添加代码时似乎没有效果,我错过了什么?
此外,我还在考虑将在docbook中使用的外部参照更改为DITA中的相关链接。这是一个好主意吗? ppl遇到了哪些问题需要创建相关链接?
答案 0 :(得分:2)
是否可以将其组合成一个 单个XSL?
在具有多个样式表模块的单个转换中表达它是可行的。
如果您不知道DITA XSLT的工作原理,最好的方法是:对XSLT DITA使用import
声明,并声明自己的规则。
修改:示例。假设这个样式表base.xsl
:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="root">
<html>
<xsl:apply-templates/>
</html>
</xsl:template>
<xsl:template match="parent">
<p>
<xsl:apply-templates/>
</p>
</xsl:template>
<xsl:template match="child">
<b>
<xsl:apply-templates/>
</b>
</xsl:template>
</xsl:stylesheet>
使用此输入:
<root>
<parent>
<child>1</child>
</parent>
<parent>
<child>2</child>
</parent>
<parent>
<child>3</child>
</parent>
<parent>
<child>4</child>
</parent>
</root>
输出:
<html>
<p>
<b>1</b>
</p>
<p>
<b>2</b>
</p>
<p>
<b>3</b>
</p>
<p>
<b>4</b>
</p>
</html>
现在,这个样式表正在使用import
。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="base.xsl"/>
<xsl:template match="parent">
<div>
<xsl:apply-templates/>
</div>
</xsl:template>
</xsl:stylesheet>
输出:
<html>
<div>
<b>1</b>
</div>
<div>
<b>2</b>
</div>
<div>
<b>3</b>
</div>
<div>
<b>4</b>
</div>
</html>
答案 1 :(得分:1)
可以按顺序(链)应用两个或多个转换,每个转换都对前一个转换进行操作。
以下是如何在XSLT 2.0中将两个转换链接在一起(XSLT 1.0示例类似,但需要在每个中间结果上使用xxx:node-set()
函数):
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vPass1">
<xsl:apply-templates select="/*"/>
</xsl:variable>
<xsl:template match="node()|@*" name="id" mode="#default pass2">
<xsl:copy>
<xsl:apply-templates select="node()|@*" mode="#current"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:apply-templates select="$vPass1" mode="pass2"/>
</xsl:template>
<xsl:template match="num/text()">
<xsl:value-of select="2*."/>
</xsl:template>
<xsl:template match="num/text()" mode="pass2">
<xsl:value-of select="1+."/>
</xsl:template>
</xsl:stylesheet>
将此转换应用于以下XML文档时:
<nums>
<num>1</num>
<num>2</num>
<num>3</num>
<num>4</num>
<num>5</num>
</nums>
按顺序应用两个转换。第一次转换的结果是一个新的XML文档,其中每个num/text()
节点的值是原始num/text()
节点值的两倍。第二个转换应用于此中间结果,其操作是将1
添加到每个num/text()
节点,并将此结果生成为新的相应`num / text()'节点。
因此,推测结果是每$n
(每个num/text()
节点的值)转换为2*$n+1
:
<nums>
<num>3</num>
<num>5</num>
<num>7</num>
<num>9</num>
<num>11</num>
</nums>