使用 DITA OT Epub 插件更改 epub 输出中的 xhtml 主题文件名
Changing the xhtml topic file names in epub output using DITA OT Epub plugin
我需要使用 EPUB DITA OT 插件更改 EPUB 输出中的主题文件名:
我的 Ditamap 文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pubmap
PUBLIC "urn:pubid:com.sam.doctypes:dita:pubmap" "pubmap.dtd">
<pubmap xml:lang="en-US">
<pubtitle>
<mainpubtitle outputclass="book">Sample Word</mainpubtitle>
</pubtitle>
<topicref href="topics/topic_1.dita">
<topicmeta>
<navtitle>Ram-Files-Raj (RFR)</navtitle>
<metadata/>
</topicmeta>
</topicref>
<topicref href="topics/topic_2.dita">
<topicmeta>
<navtitle>Files-Sampletitle (FST)</navtitle>
<metadata/>
</topicmeta>
</topicref>
</pubmap>
我的topic_1.dita文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE topic
PUBLIC "urn:pubid:com.sam.doctypes:dita:topic" "topic.dtd">
<topic id="topic_1" xml:lang="en-US" outputclass="Ram-Files-RajRFR"><title>Ram-Files-Raj (RFR)</title></topic>
我的topic_2.dita文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE topic
PUBLIC "urn:pubid:com.sam.doctypes:dita:topic" "topic.dtd">
<topic id="topic_2" xml:lang="en-US" outputclass="Files-SampletitleFST"><title>Files-Sampletitle (FST)</title></topic>
使用 DITA OT EPUB 插件中的以下模板更改文件名
<xsl:template match="*[df:class(., 'topic/topic')]" mode="generate-content">
<xsl:param name="doDebug" as="xs:boolean" tunnel="yes" select="false()"/>
<!-- This template generates the output file for a referenced topic.
-->
<!-- The topicref that referenced the topic -->
<xsl:param name="topicref" as="element()?" tunnel="yes"/>
<!-- Result URI to which the document should be written. -->
<xsl:param name="resultUri" as="xs:string" tunnel="yes"/>
<xsl:if test="$doDebug">
<xsl:message> + [DEBUG] generate-content: handling topic <xsl:value-of select="name(.)"/>...</xsl:message>
<xsl:message> + [DEBUG] generate-content: Generating base HTML using default-mode HTML generation....</xsl:message>
</xsl:if>
<xsl:variable name="htmlNoNamespace" as="node()*">
<xsl:apply-templates select="." mode="map-driven-content-processing">
<xsl:with-param name="topicref" select="$topicref" as="element()?" tunnel="yes"/>
</xsl:apply-templates>
</xsl:variable>
<xsl:if test="$doDebug">
<xsl:message> + [DEBUG] generate-content: Generating XHTML from base HTML...</xsl:message>
</xsl:if>
<xsl:variable name="xhtml" as="node()*">
<xsl:apply-templates select="$htmlNoNamespace" mode="html2xhtml">
<xsl:with-param name="topicref" select="$topicref" as="element()?" tunnel="yes"/>
<xsl:with-param name="resultUri" as="xs:string" tunnel="yes" select="$resultUri"/>
</xsl:apply-templates>
</xsl:variable>
<xsl:if test="$doDebug">
<xsl:message> + [DEBUG] xhtml:
<xsl:sequence select="$xhtml"/></xsl:message>
</xsl:if>
<xsl:message> + [INFO] Writing topic <xsl:value-of select="$topicref/@href"/> to HTML file "<xsl:sequence select="$resultUri"/>"...</xsl:message>
<xsl:result-document format="html5"
href="{$resultUri}"
exclude-result-prefixes="opf">
<xsl:sequence select="$xhtml"/>
</xsl:result-document>
</xsl:template>
<xsl:template match="*[df:isTopicRef(.)]" mode="generate-content">
<xsl:param name="doDebug" as="xs:boolean" tunnel="yes" select="false()"/>
<xsl:param name="rootMapDocUrl" as="xs:string" tunnel="yes"/>
<!-- <xsl:variable name="doDebug" as="xs:boolean" select="true()"/>-->
<xsl:if test="$doDebug">
<xsl:message> + [DEBUG] Handling topicref to "<xsl:sequence select="string(@href)"/>" in mode generate-content</xsl:message>
</xsl:if>
<xsl:variable name="topic" select="df:resolveTopicRef(.)" as="element()*"/>
<xsl:choose>
<xsl:when test="not($topic)">
<xsl:message> + [WARNING] generate-content: Failed to resolve topic reference to href "<xsl:sequence select="string(@href)"/>"</xsl:message>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="topicResultUri"
select="htmlutil:getTopicResultUrl($outdir, root($topic), $rootMapDocUrl, $doDebug)"
as="xs:string"
/>
<!-- Do href fixup before doing full default-mode processing: -->
<xsl:variable name="tempTopic" as="document-node()">
<xsl:document>
<xsl:apply-templates select="$topic" mode="href-fixup">
<xsl:with-param name="topicResultUri" select="$topicResultUri"
tunnel="yes"/>
<xsl:with-param name="topicref" as="element()" select="." tunnel="yes"/>
</xsl:apply-templates>
</xsl:document>
</xsl:variable>
<!-- Apply templates in default mode to the topic with fixed up hrefs: -->
<xsl:apply-templates select="$tempTopic" mode="#current">
<xsl:with-param name="topicref" as="element()" select="." tunnel="yes"/>
<xsl:with-param name="resultUri" select="$topicResultUri"
tunnel="yes"/>
</xsl:apply-templates>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
我得到的 epub 输出中的输出主题文件名是 "topic_1_d76.xhtml"、"topic_2_d77.xhtml",等等...
但我需要主题标题作为 epub 输出中的文件名 "Ram_Files_Raj_RFR.xhtml"、"Files_Sampletitle_FST.xhtml".
请就此问题向我提出建议。
提前致谢
函数 htmlutil:getResultTopicBaseName() 为从主题生成的结果 HTML 文件生成文件名。
该函数使用模式get-result-topic-base-name的模板(如果您没有明确开启single-dir文件组织策略),其基本实现是:
<xsl:template match="/" mode="get-result-topic-base-name">
<xsl:param name="topicref" tunnel="yes" as="element()?"/>
<xsl:param name="topicUri" as="xs:string"/>
<!-- Default template for organizational strategies other than single-dir -->
<xsl:variable name="baseName" as="xs:string">
<xsl:choose>
<xsl:when test="string($topicref/@copy-to) != ''">
<xsl:sequence select="relpath:getNamePart($topicref/@copy-to)"/>
</xsl:when>
<xsl:otherwise>
<xsl:sequence select="relpath:getNamePart($topicUri)"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:sequence select="$baseName"/>
</xsl:template>
默认情况下仅使用@copy-to 或@href 值。
您可以覆盖此模板来执行您想要的操作,例如,使用主题的标题。
如果您使用的是 OT 1.8.5,另一个选项是扩展 Adjust Copy-to 插件以将 @copy-to 属性设置为您想要的文件名。这具有将这些文件名应用于任何 OT 进程的效果,而不仅仅是 EPUB,但需要您使用 D4P 提供的转换(EPUB、D4P HTML2、 D4P HTML5).
Adjust Copy-to 插件(目前)不能与 2.x 和 3.x Open Toolkit 一起使用,因为预处理已在很大程度上被重写,我还没有机会更新 EPUB 插件。我目前正在更新 EPUB 转换以使用 OT 2.5.4 和 3.x.
我需要使用 EPUB DITA OT 插件更改 EPUB 输出中的主题文件名:
我的 Ditamap 文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pubmap
PUBLIC "urn:pubid:com.sam.doctypes:dita:pubmap" "pubmap.dtd">
<pubmap xml:lang="en-US">
<pubtitle>
<mainpubtitle outputclass="book">Sample Word</mainpubtitle>
</pubtitle>
<topicref href="topics/topic_1.dita">
<topicmeta>
<navtitle>Ram-Files-Raj (RFR)</navtitle>
<metadata/>
</topicmeta>
</topicref>
<topicref href="topics/topic_2.dita">
<topicmeta>
<navtitle>Files-Sampletitle (FST)</navtitle>
<metadata/>
</topicmeta>
</topicref>
</pubmap>
我的topic_1.dita文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE topic
PUBLIC "urn:pubid:com.sam.doctypes:dita:topic" "topic.dtd">
<topic id="topic_1" xml:lang="en-US" outputclass="Ram-Files-RajRFR"><title>Ram-Files-Raj (RFR)</title></topic>
我的topic_2.dita文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE topic
PUBLIC "urn:pubid:com.sam.doctypes:dita:topic" "topic.dtd">
<topic id="topic_2" xml:lang="en-US" outputclass="Files-SampletitleFST"><title>Files-Sampletitle (FST)</title></topic>
使用 DITA OT EPUB 插件中的以下模板更改文件名
<xsl:template match="*[df:class(., 'topic/topic')]" mode="generate-content">
<xsl:param name="doDebug" as="xs:boolean" tunnel="yes" select="false()"/>
<!-- This template generates the output file for a referenced topic.
-->
<!-- The topicref that referenced the topic -->
<xsl:param name="topicref" as="element()?" tunnel="yes"/>
<!-- Result URI to which the document should be written. -->
<xsl:param name="resultUri" as="xs:string" tunnel="yes"/>
<xsl:if test="$doDebug">
<xsl:message> + [DEBUG] generate-content: handling topic <xsl:value-of select="name(.)"/>...</xsl:message>
<xsl:message> + [DEBUG] generate-content: Generating base HTML using default-mode HTML generation....</xsl:message>
</xsl:if>
<xsl:variable name="htmlNoNamespace" as="node()*">
<xsl:apply-templates select="." mode="map-driven-content-processing">
<xsl:with-param name="topicref" select="$topicref" as="element()?" tunnel="yes"/>
</xsl:apply-templates>
</xsl:variable>
<xsl:if test="$doDebug">
<xsl:message> + [DEBUG] generate-content: Generating XHTML from base HTML...</xsl:message>
</xsl:if>
<xsl:variable name="xhtml" as="node()*">
<xsl:apply-templates select="$htmlNoNamespace" mode="html2xhtml">
<xsl:with-param name="topicref" select="$topicref" as="element()?" tunnel="yes"/>
<xsl:with-param name="resultUri" as="xs:string" tunnel="yes" select="$resultUri"/>
</xsl:apply-templates>
</xsl:variable>
<xsl:if test="$doDebug">
<xsl:message> + [DEBUG] xhtml:
<xsl:sequence select="$xhtml"/></xsl:message>
</xsl:if>
<xsl:message> + [INFO] Writing topic <xsl:value-of select="$topicref/@href"/> to HTML file "<xsl:sequence select="$resultUri"/>"...</xsl:message>
<xsl:result-document format="html5"
href="{$resultUri}"
exclude-result-prefixes="opf">
<xsl:sequence select="$xhtml"/>
</xsl:result-document>
</xsl:template>
<xsl:template match="*[df:isTopicRef(.)]" mode="generate-content">
<xsl:param name="doDebug" as="xs:boolean" tunnel="yes" select="false()"/>
<xsl:param name="rootMapDocUrl" as="xs:string" tunnel="yes"/>
<!-- <xsl:variable name="doDebug" as="xs:boolean" select="true()"/>-->
<xsl:if test="$doDebug">
<xsl:message> + [DEBUG] Handling topicref to "<xsl:sequence select="string(@href)"/>" in mode generate-content</xsl:message>
</xsl:if>
<xsl:variable name="topic" select="df:resolveTopicRef(.)" as="element()*"/>
<xsl:choose>
<xsl:when test="not($topic)">
<xsl:message> + [WARNING] generate-content: Failed to resolve topic reference to href "<xsl:sequence select="string(@href)"/>"</xsl:message>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="topicResultUri"
select="htmlutil:getTopicResultUrl($outdir, root($topic), $rootMapDocUrl, $doDebug)"
as="xs:string"
/>
<!-- Do href fixup before doing full default-mode processing: -->
<xsl:variable name="tempTopic" as="document-node()">
<xsl:document>
<xsl:apply-templates select="$topic" mode="href-fixup">
<xsl:with-param name="topicResultUri" select="$topicResultUri"
tunnel="yes"/>
<xsl:with-param name="topicref" as="element()" select="." tunnel="yes"/>
</xsl:apply-templates>
</xsl:document>
</xsl:variable>
<!-- Apply templates in default mode to the topic with fixed up hrefs: -->
<xsl:apply-templates select="$tempTopic" mode="#current">
<xsl:with-param name="topicref" as="element()" select="." tunnel="yes"/>
<xsl:with-param name="resultUri" select="$topicResultUri"
tunnel="yes"/>
</xsl:apply-templates>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
我得到的 epub 输出中的输出主题文件名是 "topic_1_d76.xhtml"、"topic_2_d77.xhtml",等等... 但我需要主题标题作为 epub 输出中的文件名 "Ram_Files_Raj_RFR.xhtml"、"Files_Sampletitle_FST.xhtml".
请就此问题向我提出建议。
提前致谢
函数 htmlutil:getResultTopicBaseName() 为从主题生成的结果 HTML 文件生成文件名。
该函数使用模式get-result-topic-base-name的模板(如果您没有明确开启single-dir文件组织策略),其基本实现是:
<xsl:template match="/" mode="get-result-topic-base-name">
<xsl:param name="topicref" tunnel="yes" as="element()?"/>
<xsl:param name="topicUri" as="xs:string"/>
<!-- Default template for organizational strategies other than single-dir -->
<xsl:variable name="baseName" as="xs:string">
<xsl:choose>
<xsl:when test="string($topicref/@copy-to) != ''">
<xsl:sequence select="relpath:getNamePart($topicref/@copy-to)"/>
</xsl:when>
<xsl:otherwise>
<xsl:sequence select="relpath:getNamePart($topicUri)"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:sequence select="$baseName"/>
</xsl:template>
默认情况下仅使用@copy-to 或@href 值。
您可以覆盖此模板来执行您想要的操作,例如,使用主题的标题。
如果您使用的是 OT 1.8.5,另一个选项是扩展 Adjust Copy-to 插件以将 @copy-to 属性设置为您想要的文件名。这具有将这些文件名应用于任何 OT 进程的效果,而不仅仅是 EPUB,但需要您使用 D4P 提供的转换(EPUB、D4P HTML2、 D4P HTML5).
Adjust Copy-to 插件(目前)不能与 2.x 和 3.x Open Toolkit 一起使用,因为预处理已在很大程度上被重写,我还没有机会更新 EPUB 插件。我目前正在更新 EPUB 转换以使用 OT 2.5.4 和 3.x.