1

2 つの xml ドキュメントがあります。

  1. 小さなインライン画像を含む技術記事
  2. とりわけ、記事内の小さな画像のフルサイズ バージョンである 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>
4

2 に答える 2

1

あなたが間違っている最初のことは、オフセットによって物事をリンクしようとすることです.50年ほどの間、実装へのリンクの最も単純な形式であり、最も脆弱でエラーが発生しやすい形式としてよく知られています. 何かが変わるたびに壊れ、壊れるときは静かに壊れるので、本当に危険です。トラブルを求めているだけです。しないでください。(この傷跡が見えますか?そしてそこにありますか?オフセットベースのリンクを確実に機能させようとしている人がいます。私の悲しみと涙から学びましょう!)

(あなたの例のように)小さい画像と大きい画像が同じalt属性を持ち、画像ファイル名が体系的に関連している場合、次のようなものでより良い結果が得られます

<xsl:variable name="alt" select="@alt"/>
<xsl:copy-of select="document('side-file.xml',/)
                     //img[@alt = $alt]"/>

必要に応じて、ファイル名のサニティ チェックを実行します。

<xsl:variable name="fn-small" select="@src"/>
<xsl:variable name="fn-big" 
              select="document('side-file.xml',/)
                     //img[@alt = $alt]/
                     @src"/>
<xsl:if test="substring-before($fn-small,'.jpg')
             != substring-before($fn-big,'_ian.jpg')">
  <xsl:message>Problems with image <xsl:value-of 
    select="concat($fn-small, ' / ', $fn-big)"/>.</xsl:message>
</xsl:if>

ただし、メイン ファイルとサイド ファイルに小さなイメージと大きなイメージが同じ順序で確実に含まれている場合は、試みているアプローチを機能させることができます。(少なくとも、いずれかのドキュメントで最初に順序または図の数が変更されるまでは。)メイン ファイルはほとんど表示されず、サイド ファイルは表示されないため、コードの何が問題なのかを正確に知ることは困難です。 、しかし、いくつかの明らかな確認事項があります。

  • <xsl:number/>デフォルトは<xsl:number level="single" .../>-- であるため、メイン ドキュメントのすべての図が兄弟である場合は問題なく動作するはずです。(それは、14 の図があり、セクションがない技術記事を持っていることを意味します。そうではないことを教えてください。) 図の実行順序番号が必要な場合は、次のようなものが必要です<xsl:number level="any"/>-- 一部の XSLT コーダーは代わりに書くと思います<xsl:variable name="figureNumber" select="1 + count(preceeding::figure)"/>
  • あなたが書いたという事実document('sidefile.xml',/)//figure ...は、サイドドキュメントの図要素が任意の深さであり、必ずしもすべての兄弟ではないことを示唆しています。もしそうなら、それらを選択すること[$figureNumer]は決してうまくいきません。// が /descendant-or-self::*/ に展開されることを思い出してください。したがって、式は次のように展開されます。

    document('sidefile.xml',/)
      /descendant-or-self::*
      /child::figure[position() = $figureNumber]
      /img
    

これは、述語内の暗黙的な position() が、ドキュメント ノードの Figure の子孫内での位置ではなく、親の Figure の子のシーケンスにおける Figure の位置を取得することを意味します。

于 2013-08-16T17:33:37.690 に答える
0

同僚の非常に単純な提案のおかげで、問題が特定され、修正されました。

$figureRef 変数は既に文字列値であるため、一重引用符で囲む必要はありません。引用符を追加すると、必要な結果セットが得られないことが保証されました。そう....

前:

<xsl:variable name="figureRef" select="concat($singleQuote,substring-after(following::a[1]/@href,'#'),$singleQuote)"/>

後:

<xsl:variable name="figureRef"><xsl:value-of select="substring-after(following::a[1]/@href,'#')"/></xsl:variable>

document() 関数で使用します。

<xsl:copy-of select="document('sidefile.xml',/)/dw-document/dw-sidefile/docbody/figure/img[preceding::heading[1]/@refname = $figureRef]" />
于 2013-08-20T15:04:04.613 に答える