如何为所有被引用的文档创建节点树并用xslt将其存储到变量中?(我正在使用xslt 2.0)
这是我的文件结构:
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>
特定语言手册(.ditamap)-可能有多个文档
<bookmap id="X000263" xml:lang="de-DE"><chapter href="A.2+X000264.ditamap"/></bookmap>
每本手册的章节
<map id="X000264" xml:lang="de-DE"><topicref href="A.2+X000265.ditamap"/></map>
目录(.dita)或子章节(.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>
我的目标是一个完整的XML树(可以说是一个“组合”文档),所有文件都正确地嵌套到它们的引用中,给出父节点。
有没有一种简单的方法可以创建一个包含<xsl:copy-of>的组合文档(也许可以使用多个“select”选项)?

最佳答案

你需要在引用之后编写模板,例如。

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

09-07 09:33