0

InDesignタグ付きテキストを使用して相互参照を作成する方法の解決策を探していますが、適切な提案が見つかりません。

これが私のシナリオで、XMLからInDesignおよびInDesignからXML、またはその逆のラウンドトリップワークフローを作成するタスクでした。また、URLリンクとEndNotesリンクを相互参照する必要があります。

そのため、最初に、XMLをInDesignタグ付きテキストに変換するXSLTスクリプトを作成する必要があります(ほとんどのオペレーターがまだInDesign CS3を使用しているため、タグ付きテキストを使用しました)。次に、ページの作成が完了したら、InDesignファイルをXHTMLにエクスポートする必要があります(dreamweaver用にエクスポートします)。別のXSLTスクリプトを作成して、ePub変換に使用するXHTMLからXMLに変換し直します(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>

タグ付けされたテキストをInDesignURLにインポートし、文末脚注にリンク切れがある場合の問題があります。作業リンクを使用してサンプルのInDesignをエクスポートしようとしたときに、宛先キーが相互参照する必要のある文字の位置をターゲットにしているため、これが宛先キーであると思われます。

私の質問は次のとおりです。

  1. 相互参照は、ICMLのようにInDesignタグ付きテキストでサポートされていますか?
  2. XSLT(単一ノード内の位置ではなくXML全体内の文字の位置を意味する)を使用してXML内の文字のposition()を取得する方法はありますか?可能であれば、宛先キーを正しく取得できるかもしれません。

提案や推奨事項は大歓迎です。

ありがとう!

PSこのリンクhttp://forums.adobe.com/message/3978432#3978432は、相互参照エントリのInDesignタグ付きテキストについても説明していますが、完全な解決策は示されていません。

4

1 に答える 1

1

これを自分でテストしました。インポート前にタグ付けされたテキストに相互参照を追加することは可能ですが、ご指摘のように、ドキュメント全体と比較して相互参照先の文字位置を見つける必要があります。特に特殊文字の可能性を考えると、これは難しく、エラーが発生しやすいように思えます。ただし、可能です。

<HyperlinkDestKey:5>あと、キャラの位置を狙っているのはタグではなく、タグだと思います<HyperlinkDestIndex:55555>

理想的ではないかもしれませんが、InDesign のタグ付きテキスト内に事前に相互参照を追加しようとする代わりに、タグ付きテキストをインポートした後に Javascript を適用することができます。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ます。ハイパーリンクにするテキスト オブジェクトを見つける 1 つの方法は、DOM からアクセスできる InDesign の変更検索機能を使用してそれらを見つけることです。

于 2012-11-29T15:25:02.910 に答える