我已经使用XSL将docbook文档转换为dita。转换成功了,不存在不需要的文物。我已经摆脱了其中的一些,但我已将这些更改保存在转换后运行的另一个XSL中。我的问题是:是否有可能将其组合成单个XSL?当我尝试在docbook2dita.xsl之后添加代码时,它似乎没有任何作用,我错过了什么?结合XSL文档
此外,我正在考虑将docbook中正在使用的外部参照更改为DITA中的相关链接。这是一个好主意吗?外部参照有哪些问题会导致相关链接需要创建?
我已经使用XSL将docbook文档转换为dita。转换成功了,不存在不需要的文物。我已经摆脱了其中的一些,但我已将这些更改保存在转换后运行的另一个XSL中。我的问题是:是否有可能将其组合成单个XSL?当我尝试在docbook2dita.xsl之后添加代码时,它似乎没有任何作用,我错过了什么?结合XSL文档
此外,我正在考虑将docbook中正在使用的外部参照更改为DITA中的相关链接。这是一个好主意吗?外部参照有哪些问题会导致相关链接需要创建?
是可以应用在序列中的两个或多个变换(链),每个上与前一个的结果操作。
下面是如何链在一起的两个转变在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()”节点。
因此COMULATIVE结果是,每一个$n
(每对节点num/text()
的值)变换为2*$n+1
:
<nums>
<num>3</num>
<num>5</num>
<num>7</num>
<num>9</num>
<num>11</num>
</nums>
是否有可能将其组合成一个 单个XSL?
可以用多个样式表模块在单个转换中表达这一点。
如果您不知道DITA XSLT的工作原理,最好的方法是:使用import
声明XSLT DITA,并声明自己的规则。
编辑:例子。假设这个样式表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>
是变换顺序施用,或者是他们所有并发的? – Ace 2010-10-12 23:25:02
@Ace:使用这种方法,您可以用几个模块声明**一个** trasformation。所以,这都是并发的,因为没有序列。 – 2010-10-13 13:18:12
所以如果我有8个转换(第一个是docbook2dita.xsl,那么其余顺序无关紧要),我是否有一个'master'.XSL来导入它们中的每一个?或者让每个导入另一个导入,所以它就像一个XSL链,当第一个被调用时被调用? – Ace 2010-10-19 17:58:47