2 つの xml ドキュメントがあります。
- 小さなインライン画像を含む技術記事
- とりわけ、記事内の小さな画像のフルサイズ バージョンである img を含むファイル。このファイルを「サイド ファイル」と呼びます。
私の目標は、xsl を使用して記事の xml を更新し、図ごとに 1 つの img を作成するのではなく、2 つの img を作成することです...記事の xml で最初にコード化された小さなものと、対応する大きなものです。これらの img は両方とも、新しい要素 image-set の子になります。
したがって、「前」と「後」の状況は次のとおりです。
前:
<figure>
<heading alttoc="" refname="fig1" type="figure">Figure 1. netserver on SUT in out
of the box configuration</heading>
<img alt="netserver on SUT in out-of-the-box configuration"
height="288" src="figure1.jpg" width="572"/>
</figure>
後:
<figure>
<heading alttoc="" refname="fig1" type="figure">Figure 1. netserver on SUT in out
of the box configuration</heading>
<image-set>
<img alt="netserver on SUT in out-of-the-box configuration"
height="288" src="figure1.jpg" width="572"/>
<img alt="netserver on SUT in out-of-the-box configuration"
height="456" src="figure1_ian.jpg" width="905"/>
<!--The figureNumber is: 1-->
</image-set>
</figure>
別の XSL が、更新された記事の XML ファイルを HTML に変換します。小さい画像は以前と同様にインラインで表示されますが、ユーザーが「フルサイズ バージョンを表示」リンクをクリックすると、大きい画像がオーバーレイで表示されます。
問題の説明: 各記事には多くの画像を含めることができます。各サイド ファイルには、多数の画像を含めることができます。サイド ファイルの右の画像と記事ファイルの画像を一致させる必要があります。xsl:number を使用して変数を作成し、img ごとに、各画像が記事ファイルに表示される順序に対応する番号を格納し、document() 関数でその変数を次のように参照しようとしています。サイド ファイルで正しい img を取得するための述語。動いていない:
注文を格納するための変数は次のとおりです。
<xsl:variable name="figureNumber">
<xsl:number />
</xsl:variable>
変数で機能しない document() 関数を含むコードを次に示します。
<!-- Output the larger version of the same img that sits in the sidefile.
The "/" as the second argument causes processor to look for the sidefile
in same folder as the article xml file. -->
<xsl:copy-of select="document('sidefile.xml',/)//figure[$figureNumber]/img" />
<xsl:comment>The figureNumber is: <xsl:value-of select="$figureNumber"/></xsl:comment>
これを実行すると、サイド ファイルから必要な img だけを取得する代わりに (上記の例では、最初の画像、つまり img[1] だけを取得する必要があります)、サイド ファイル内のすべての img を取得します。
<figure>
<heading alttoc="" refname="fig1" type="figure">Figure 1. netserver on SUT in out
of the box configuration</heading>
<image-set>
<img alt="netserver on SUT in out-of-the-box configuration"
height="288" src="figure1.jpg" width="572"/>
<img alt="netserver on SUT in out-of-the-box configuration"
height="456" src="figure1_ian.jpg" width="905"/>
<img alt="netperf on SUT in out-of-the-box configuration"
height="456" src="figure2_ian.jpg" width="905"/>
<img alt="netperf and netserver (bidirectional) on SUT out of the box"
height="456" src="figure3_ian.jpg" width="905"/>
<img alt="netserver, out of the box with numactl"
height="456" src="figure4_ian.jpg" width="905"/>
<img alt="netperf, out of the box with numactl"
height="456" src="figure5_ian.jpg" width="905"/>
<img alt="netperf and netserver (bidirectional), out of the box with numactl"
height="456" src="figure6_ian.jpg" width="905"/>
<img alt="netserver, Ethernet SMP IRQ affinity, no irqbalance"
height="456" src="figure7_ian.jpg" width="905"/>
<img alt="netperf, Ethernet SMP IRQ affinity, no irqbalance"
height="456" src="figure8_ian.jpg" width="905"/>
<img alt="netperf and netserver (bidirectional), Ethernet SMP IRQ affinity, no irqbalance"
height="456" src="figure9_ian.jpg" width="905"/>
<img alt="netserver, Ethernet SMP IRQ affinity and numactl, no irqbalance"
height="456" src="figure10_ian.jpg" width="905"/>
<img alt="netperf, Ethernet SMP IRQ affinity and numactl, no irqbalance"
height="456" src="figure11_ian.jpg" width="905"/>
<img alt="Bidirectional, Ethernet SMP IRQ affinity and numactl, no irqbalance"
height="456" src="figure12_ian.jpg" width="905"/>
<img alt="netserver, Ethernet SMP IRQ affinity, no irqbalance, bonded interfaces"
height="456" src="figure13_ian.jpg" width="905"/>
<img alt="netserver, Ethernet SMP IRQ affinity, no irqbalance, with and without bonding"
height="456" src="figure14_ian.jpg" width="905"/>
<!--The figureNumber is: 1-->
</image-set>
</figure>
ただし、document() 関数で述語をハードコーディングすると、正しい img しか得られません (上記の「After」の例のように)。
<xsl:copy-of select="document('sidefile.xml',/)//figure[1]/img" />
私は oXygen 14.2 を使用しており、XALAN と SAXON の両方でこの変換を試しましたが、同じ結果が得られました。
私は何を間違っていますか?
2013 年 8 月 19 日更新:
私はそれ以来、サイドファイルで正しいものを取得する別の方法を試しましたが、 document() 関数をその中の変数で動作させることができませんでした。前の方法 (オフセットを使用) と同様に、document() 関数の変数をリテラルに置き換えると、機能します。
これは機能します:
<xsl:copy-of select="document('sidefile.xml',/)/dw-document/dw-sidefile/docbody/figure/img[preceding::heading[1]/@refname = 'fig1']" />
これはしません:
<xsl:copy-of select="document('sidefile.xml',/)/dw-document/dw-sidefile/docbody/figure/img[preceding::heading[1]/@refname = $figureRef]" />
$figureRef 変数は次のように定義されます。記事ファイルの Figure 要素にポインタを置き、Figure に続く最初のアンカーの @href 値の「#」の後の文字列を取得します。次に、一重引用符で囲みます。
<xsl:variable name="figureRef" select="concat($singleQuote,substring-after(following::a[1]/@href,'#'),$singleQuote)"/>
これらの要素を示す記事ファイルの xml スニペットを次に示します。
<figure>
<heading alttoc="" refname="fig1" type="figure">Figure 1. netserver on SUT in out of the box configuration</heading>
<img alt="netserver on SUT in out-of-the-box configuration" height="288" src="figure1.jpg" width="572"/>
</figure>
<p><b><a href="http://www.ibm.com/developerworks/library/l-scalability/sidefile.html#fig1">Enlarge Figure 1.</a></b></p>
...そして、ドキュメント関数の直前に xsl:comment を追加して、その値が本来あるべき値であることを確認しているため、 figureRef 変数が記事の各図の正しい値に解決されていることがわかります。
<xsl:when test="not(image-set)">
<xsl:element name="figure">
<xsl:apply-templates select="heading" />
<xsl:element name="image-set">
<!-- Output the img element that was inside the original figure element -->
<xsl:apply-templates select="img" />
<!-- Output the larger version of the same img that sits in the
sidefile. The "/" as the second argument causes processor to look for the
sidefile in same folder as the article xml file. -->
<xsl:comment>The figureRef is: <xsl:value-of select="$figureRef"/></xsl:comment>
<xsl:copy-of
select="document('sidefile.xml',/)/dw-document/dw-sidefile/docbody/figure/img[preceding::heading[1]/@refname = $figureRef]" />
<xsl:comment>The figureNumber is: <xsl:value-of select="$figureNumber"/></xsl:comment>
</xsl:element>
</xsl:element>
</xsl:when>
...そして、以下の結果ドキュメントのスニペットから正しいことがわかります (最初の要素の後に別の img 要素があるはずです):
<image-set>
<img alt="netserver on SUT in out-of-the-box configuration" height="288" src="figure1.jpg" width="572"/>
<!--The figureRef is: 'fig1'-->
<!--The figureNumber is: 1-->
</image-set>
おいおい。サイド ファイルの構造を示す xml スニペットを次に示します。
<figure>
<heading alttoc="" refname="fig1" type="figure">Figure 1. netserver on SUT in out
of the box configuration</heading>
<img alt="netserver on SUT in out-of-the-box configuration" height="456" src="figure1_ian.jpg" width="905"/>
</figure>
<!-- Spacer -->
<br/>
<br/>
<!-- Return link -->
<p>
<a href="index.html#fig1">Return to article</a>
</p>
<!-- Spacer -->
<br/>
<figure>
<heading alttoc="" refname="fig2" type="figure">Figure 2. netperf on SUT in out of
the box configuration</heading>
<img alt="netperf on SUT in out-of-the-box configuration" height="456" src="figure2_ian.jpg" width="905"/>
</figure>