そのため、para
が含まれているxref
場合、リンクされた図 (属性を除いたid
もの) をコンテンツの先頭にコピーする必要がありpara
ます。ID で要素にすばやくアクセスするためのキーを定義します。figure
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="figureById" match="figure" use="@id" />
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
</xsl:template>
<xsl:template match="para[.//xref]">
<xsl:copy>
<xsl:apply-templates select="@*" /><!-- may not be necessary -->
<!-- copy in referenced figures -->
<xsl:apply-templates select="key('figureById', .//xref/@linkend)"
mode="noid"/>
<!-- and continue with child nodes as normal -->
<xsl:apply-templates select="node()" />
</xsl:copy>
</xsl:template>
<!-- special almost-identity template to remove the id attribute -->
<xsl:template match="node()" mode="noid">
<xsl:copy>
<xsl:apply-templates select="@*[local-name() != 'id']|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
これはkey
、ノード セットを 2 番目の引数 (検索するキー値) として渡すと、結果は各キー値を順番に検索した結果のノード セットの和集合になるという関数の優れた機能を利用します。 . したがって、このパラグラフの要素のいずれかに一致key('figureById', xref/@linkend)
するすべての図要素が得られますが、同じ図が複数回参照されている場合、挿入される図のコピーは 1 つだけです。id
xref
コピーされた図を指すように参照を更新すると、ケーキのアイシングになります
これは、コピーされた図の ID を書き直してgenerate-id()
ターゲット段落の を含め、リンクエンドで同じ変換を使用することで実現できxref
ます。このようなもの:
<xsl:template match="para[.//xref]">
<xsl:copy>
<xsl:apply-templates select="@*" /><!-- may not be necessary -->
<!-- copy in referenced figures, modifying their ids to include our own -->
<xsl:apply-templates select="key('figureById', .//xref/@linkend)"
mode="modify-id">
<xsl:with-param name="targetNode" select="." />
</xsl:apply-templates>
<!-- and continue with child nodes as normal -->
<xsl:apply-templates select="node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="node()" mode="modify-id">
<xsl:param name="targetNode" />
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:attribute name="id">
<xsl:value-of select="concat(generate-id($targetNode), '-', @id)" />
</xsl:attribute>
<xsl:apply-templates select="node()" />
</xsl:copy>
</xsl:template>
<!-- munge linkend attributes in the same way we did for copied figure ids -->
<xsl:template match="para//xref/@linkend">
<xsl:attribute name="linkend">
<xsl:value-of select="concat(generate-id(ancestor::para[1]), '-', .)" />
</xsl:attribute>
</xsl:template>
私のシステムでは、xsltproc
(そしてあなたの例をルートタグでラップして適切な形式にする)を使用すると、これが生成されます
<?xml version="1.0"?>
<root>
<chapter id="intro">
<title>Introduction</title>
<para><figure id="idp1744-some-figure"><title>my figure...</title><mediaobject>...</mediaobject></figure>Welcome to our new product. One of its
new features is a <xref linkend="idp1744-some-figure"/>.
Other new features include ...
</para>
<para><figure id="idp2656-some-figure"><title>my figure...</title><mediaobject>...</mediaobject></figure>Grab that <xref linkend="idp2656-some-figure"/> and pull it here too.</para>
</chapter>
<chapter>
<title>Some other chapter</title>
<para>This chapter contains the figure!
<figure id="some-figure"><title>my figure...</title><mediaobject>...</mediaobject></figure>
</para>
</chapter>
</root>
生成された ID の正確な形式 (idpNNNN
この例では ) はプロセッサによって異なりますが、一意で一貫性があることが保証されています。