0

我一直在寻找有关如何使用 InDesign Tagged Text 创建交叉引用的解决方案,但找不到任何好的建议。

这是我的场景,我的任务是为 XML 到 InDesign 和 InDesign 到 XML 创建一个往返工作流,反之亦然。我还需要交叉引用 URL 和 End Notes 链接。

因此,首先,我必须创建将 XML 转换为 InDesign 标记文本的 XSLT 脚本(我使用了标记文本,因为我们的大多数操作员仍在使用 InDesign CS3)。然后在页面合成完成后,我们必须将 InDesign 文件导出为 XHTML(为 dreamweaver 导出)。创建另一个 XSLT 脚本以将 XHTML 转换回 XML 以用于 ePub 转换(为什么不直接将 InDesign 导出到 ePub?答案是需要大量定制)。

下面是我为标记文本创建交叉引用的 XSLT 代码:

向 InDesign 添加交叉引用:

<xsl:template match="/">
    <--! End Notes -->
    <xsl:text>&#60;XRefFmtDefn:=&#60;FmtNm:ntf>&#60;CharStyleRef:ntf>&#60;BldBlkLen:1>&#60;BldBlk:=&#60;BlkTyp:ParagraphNumber>&#60;CstmTxt:>&#60;CharStyleRef:>&#60;InclDlm:0>>></xsl:text>
    <xsl:for-each select="descendant::apnf">
        <xsl:variable name="num" select="count(preceding::apnf) + 1"/>
        <xsl:text>&#60;HplDestDfn:=&#60;HplDestName:Anchor </xsl:text><xsl:value-of select="$num"/><xsl:text>>&#60;DestKey:</xsl:text><xsl:value-of select="$num"/><xsl:text>>&#60;HplDestIdx:1</xsl:text><xsl:text>>&#60;IsPara:1>&#60;Hid:0>></xsl:text>
    </xsl:for-each>

    <--! URL -->

    <xsl:text disable-output-escaping="yes">&#60;HplDestDfn:=</xsl:text>
    <xsl:for-each select="descendant::libelle[generate-id()=generate-id(key('urlDistinct', @cible)[1])]">
        <xsl:value-of select="concat('&#60;HplDestName:', replace(@cible,'/', '\\/'),'&#62;&#60;DestKey:1&#62;&#60;HplDestUrl:http\:\/\/', replace(@cible,'/', '\\/'), '&#62;')"/>
    </xsl:for-each>
    <xsl:text disable-output-escaping="yes">&#60;Hid:0&#62;&#62;</xsl:text>
    <xsl:apply-templates/>
</xsl:template>

为尾注创建交叉引用链接:

<xsl:template match="apnf">
    <xsl:variable name="num" select="count(preceding::apnf) + 1"/>
    <xsl:text>&#60;cstyle:ntf&#62;</xsl:text>
    <xsl:text>&lt;Hpl:=&lt;HplName:</xsl:text><xsl:value-of select="@id"/> <xsl:text>>&lt;HplDest:Anchor </xsl:text><xsl:value-of select="$num"/><xsl:text>>&lt;DestKey:</xsl:text><xsl:value-of select="$num"/><xsl:text>>&lt;XRefFmt:ntf>&lt;CharStyleRef:>&lt;HplLen:1>&lt;HplOff:0>&lt;Hid:0>&lt;Brdrv:0>&lt;Brdrw:Thin>&lt;Brdrh:None>&lt;Brdrs:Solid>&lt;Brdrc:0\,0\,0>></xsl:text>
    <xsl:value-of select="$num"/>
    <xsl:text>&#60;cstyle:&#62;</xsl:text>
</xsl:template>

创建交叉引用 URL

<xsl:template match="url">
    <xsl:text>&#60;cstyle:url&#62;</xsl:text>
    <xsl:choose>
        <xsl:when test="exists(libelle)">
            <xsl:text>&lt;Hpl:=&lt;HplName:</xsl:text><xsl:value-of select="replace(libelle/@cible,'/', '\\/')"/><xsl:text>&gt;&lt;HplDest:http\:\/\/</xsl:text><xsl:value-of select="replace(libelle/@cible,'/', '\\/')"/><xsl:text>>&lt;DestKey:1>&lt;CharStyleRef:>&lt;HplLen:3>&lt;HplOff:0>&lt;Hid:0>&lt;Brdrv:0>&lt;Brdrw:Thin>&lt;Brdrh:None>&lt;Brdrs:Solid>&lt;Brdrc:0\,0\,0>></xsl:text>
            <xsl:sequence select="libelle/text()"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:sequence select="./text()"/>
        </xsl:otherwise>
    </xsl:choose>
    <xsl:text>&#60;cstyle:&#62;</xsl:text>
</xsl:template>

这是我的问题,当我将标记文本导入 InDesign URL 并且尾注有死链接时。我怀疑它是目标键,因为当我尝试使用工作链接导出示例 InDesign 时,目标键的目标是应该交叉引用的字符位置。

我的问题是:

  1. 像 ICML 这样的 InDesign 标记文本是否支持交叉引用?
  2. 有没有一种方法可以使用 XSLT 获取 XML 中字符的 position() (意思是整个 XML 中的字符位置而不是单个节点中的位置)?如果可能的话,也许我可以正确获得目标密钥。

任何建议或建议都将受到高度赞赏。

谢谢!

PS 此链接http://forums.adobe.com/message/3978432#3978432还讨论了用于交叉引用条目的 InDesign 标记文本,但没有给出完整的解决方案。

4

1 回答 1

1

刚刚为自己测试了这个。可以在导入之前添加对标记文本的交叉引用,但正如您所指出的,与整个文档相比,您必须找到交叉引用目标的字符位置。这听起来很困难且容易出错,尤其是当您考虑特殊字符的可能性时。虽然,这是可能的。

另外,我不认为这是<HyperlinkDestKey:5>针对字符位置的标签,我认为是<HyperlinkDestIndex:55555>标签。

这可能并不理想,但您可以在导入标记文本后应用 Javascript,而不是尝试在 InDesign 标记文本中预先添加交叉引用。使用 Javascript API 进行交叉引用会更容易,但也会更慢。

下面是一个通过 Javascript API 使用超链接的示例:

// Get the currently active document
var doc = app.activeDocument;

// Get the hyperlink source and destinations by feeding them 
// an InDesign text object.
var linkSource = doc.hyperlinkTextSources.add(sourceText);
var linkDest = doc.textDestinations.add(destText);

// Add the hyperlink to the document
doc.hyperlinks.add(linkSource, linkDest);

您可以通过在文档中找到它们来获取sourceText和。destText查找您想要制作成超链接的文本对象的一种方法是使用可从 DOM 访问的 InDesign 的查找更改功能来查找它们。

于 2012-11-29T15:25:02.910 回答