使用XSLT创建组合文档(@href)

时间:2015-08-13 11:21:44

标签: xml xslt xslt-2.0 dita

如何为所有引用的文档创建节点树并使用XSLT将其存储到变量中? (我正在使用XSLT 2.0)

这是我的文件结构:

  1. Root 文档.XML包含所有语言特定文档,如ditamaps
    <map> <navref mapref="de-DE/A.2+X000263.ditamap"/> <navref mapref="en-US/A.2+X000263.ditamap"/> <navref mapref="es-ES/A.2+X000263.ditamap"/> </map>
  2. 语言特定手册(。ditamap) - 可能的多个文件
    <bookmap id="X000263" xml:lang="de-DE"> <chapter href="A.2+X000264.ditamap"/> </bookmap>
  3. 每个手册的
  4. 章节
    <map id="X000264" xml:lang="de-DE"> <topicref href="A.2+X000265.ditamap"/> </map>
  5. 内容(。dita)或 SUB-Chapters (。ditamap)
    <map id="X000265" xml:lang="de-DE"> <topicref href="A.2+X000266.dita"/> <topicref href="A.2+X000269.dita"/> <topicref href="A.2+X000267.ditamap"/> </map>
  6. 我的目标是一个完整的xml-tree(你可以说是一个'撰写'文档),所有文件都正确嵌套到它们的引用中给父节点。

    是否有一种简单的方法可以使用<xsl:copy-of>创建一个合成文档(可能有多个'select'选项?

1 个答案:

答案 0 :(得分:4)

您需要在参考文献之后编写模板,例如

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* , node()"/>
  </xsl:copy>
</xsl:template>

复制不需要特殊处理的元素,然后

<xsl:template match="navref[@mapref]">
  <xsl:apply-templates select="doc(@mapref)/node()"/>
</xsl:template>

<xsl:template match="chapter[@href] | topicref[@href]">
  <xsl:apply-templates select="doc(@href)/node()"/>
</xsl:template>

<xsl:variable name="nested-tree">
  <xsl:apply-templates select="/*"/>
</xsl:variable>

如果你想编写其他模板然后处理变量,使用模式分离处理步骤可能是有意义的:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="2.0">

<xsl:template match="@* | node()" mode="#all">
  <xsl:copy>
    <xsl:apply-templates select="@* , node()" mode="#current"/>
  </xsl:copy>
</xsl:template>

<xsl:variable name="composed-doc">
   <xsl:apply-templates select="/*" mode="compose"/>
</xsl:variable>

<xsl:template match="navref[@mapref]" mode="compose">
  <xsl:apply-templates select="doc(@mapref)/node()" mode="compose"/>
</xsl:template>

<xsl:template match="chapter[@href] | topicref[@href]" mode="compose">
  <xsl:apply-templates select="doc(@href)/node()" mode="compose"/>
</xsl:template>

</xsl:stylesheet>