结合XSL文档

时间:2010-10-12 23:11:23

标签: xml xslt

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

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

2 个答案:

答案 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>