0

次のような XML があります。

  <section class="DoCO:Section">
    <h1 class="DoCO:SectionTitle" id="42" page="3" column="2">EXPERIMENT</h1>
    <region class="DoCO:TextChunk" id="43" page="3" column="2">lots of body<xref ref-type="bibr" rid="R7" id="35" class="deo:Reference">7</xref> text</region>
    <region class="DoCO:FigureBox" id="F4">
      <image class="DoCO:Figure" src="2cn.page_003.image_04.png" thmb="2cn.page_003.image_04-thumb.png"/>
      <caption class="deo:Caption" id="44" page="3" column="2">Figure 4: Experimental Setup</caption>
    </region>

次の XSL を使用して、xref 要素を個別に照合していました。

                <xsl:for-each select="article/body/section">
                    <sec>
                        <xsl:for-each select="h1">
                            <title>
                                <xsl:value-of select="string(.)"/>
                            </title>
                        </xsl:for-each> 

                        <xsl:for-each select="region">
                            <p>
                                <xsl:apply-templates/>
                            </p>
                        </xsl:for-each>
</xsl:template>
<xsl:template match="xref">
    <xref/>
</xsl:template>

ただし、現在領域要素を処理する非常に自由な方法を変更せずに、特定の領域内で画像要素とキャプション要素をグループ化できるようにしたいので、次のことを試みています。

<xsl:template match="@class[.='DoCO:FigureBox']">
    <fig xmlns:xlink="http://www.w3.org/1999/xlink">
        <graphic>
            <xsl:for-each select="image">
                <xsl:attribute name="xlink:href">
                    <xsl:value-of select="@src"/>
                </xsl:attribute>
            </xsl:for-each>
        </graphic>
        <caption>
            <xsl:for-each select="caption">
                <xsl:value-of select="string(.)"/>
            </xsl:for-each>
        </caption>
    </fig>
</xsl:template>

しかし、 match="@class[.='DoCO:FigureBox']" は起動していないようです。xsl:apply-templates の親の属性を、子要素で一致させるのと同じ方法で一致させることはできませんか?

ありがとう!

4

1 に答える 1

2

次の構文に問題はありません。

<xsl:template match="@class[.='DoCO:FigureBox']">

あなたの(最初の)問題はここにあります

<xsl:apply-templates/>

これはこれの省略形です

<xsl:apply-templates select="node()" />

つまり、属性を選択していないため、属性@classのテンプレート マッチは呼び出されません。

これで、これに変更できます

<xsl:apply-templates select="@*|node()" />

しかし、これは 2 つ目の問題につながります。@classに一致するテンプレート内には、 imageおよびcaption用のxsl:for-eachステートメントがいくつかあります。しかし、この時点では、領域要素ではなく@class属性に配置されているため、これらのxsl:for-eachステートメントでは何も検出されません。

おそらくすべきことは<xsl:for-each select="region">、メイン コードで行う代わりに、 <xsl:apply-templates select="region" />. 次に、次のように2つのテンプレートを作成できます

<xsl:template match="region">
   <p>
        <xsl:apply-templates />
   </p>
</xsl:template>

<xsl:template match="region[@class='DoCO:FigureBox']">
    <fig xmlns:xlink="http://www.w3.org/1999/xlink">
        <graphic>
            <xsl:for-each select="image">
                <xsl:attribute name="xlink:href">
                    <xsl:value-of select="@src"/>
                </xsl:attribute>
            </xsl:for-each>
        </graphic>
        <caption>
            <xsl:for-each select="caption">
                <xsl:value-of select="string(.)"/>
            </xsl:for-each>
        </caption>
    </fig>
</xsl:template>

この場合、XSLT プロセッサはより具体的なテンプレートを優先する必要があるため、リージョン要素のデフォルトの処理がオーバーライドされます。

実際、地域ごとに常に 1 つのキャプション画像を使用する場合は、テンプレートを次のように単純化できます。

<xsl:template match="region[@class='DoCO:FigureBox']">
    <fig xmlns:xlink="http://www.w3.org/1999/xlink">
        <graphic xlink:href="{@src}" />
        <caption>
            <xsl:value-of select="caption" />
        </caption>
    </fig>
</xsl:template>

属性を作成する際に属性値テンプレートを使用していることに注意してください。中括弧は、文字どおりに出力されるのではなく、評価される式を示します。

于 2013-10-07T22:04:47.937 に答える