2010-10-12 59 views
0

我已经使用XSL将docbook文档转换为dita。转换成功了,不存在不需要的文物。我已经摆脱了其中的一些,但我已将这些更改保存在转换后运行的另一个XSL中。我的问题是:是否有可能将其组合成单个XSL?当我尝试在docbook2dita.xsl之后添加代码时,它似乎没有任何作用,我错过了什么?结合XSL文档

此外,我正在考虑将docbook中正在使用的外部参照更改为DITA中的相关链接。这是一个好主意吗?外部参照有哪些问题会导致相关链接需要创建?

回答

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()”节点。

因此COMULATIVE结果是,每一个$n(每对节点num/text()的值)变换为2*$n+1

<nums> 
    <num>3</num> 
    <num>5</num> 
    <num>7</num> 
    <num>9</num> 
    <num>11</num> 
</nums> 
2

是否有可能将其组合成一个 单个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> 
+0

是变换顺序施用,或者是他们所有并发的? – Ace 2010-10-12 23:25:02

+0

@Ace:使用这种方法,您可以用几个模块声明**一个** trasformation。所以,这都是并发的,因为没有序列。 – 2010-10-13 13:18:12

+0

所以如果我有8个转换(第一个是docbook2dita.xsl,那么其余顺序无关紧要),我是否有一个'master'.XSL来导入它们中的每一个?或者让每个导入另一个导入,所以它就像一个XSL链,当第一个被调用时被调用? – Ace 2010-10-19 17:58:47