2

ノードに次のコンテンツを含む、変換中の入力 xml ドキュメントがあります。

 <misc-item>22 mm<br></br><fraction>7/8</fraction> in.</misc-item>

「misc-item」を選択して変数を作成すると、br タグと fraction タグが消えます。ただし、「misc-item/br」を使用して変数を作成し、それが br を見つけているかどうかをテストすると、テストは機能するようです。

私がやりたいことは、

 '<br></br>' 

スペースやセミコロンなどに入れましたが、運がありませんでした。「misc-item/br」の兄弟を取得しようとしましたが、何もありません。「misc-item」の子の数を確認しましたが、1 です。

どんな助けでも大歓迎です。

だまされた可能性があると特定された投稿を見ました。私はこれを無駄にしようとしました:

<xsl:template match="@*|node()" mode='PageOutput'>
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" mode="PageOutput" />
    </xsl:copy>
</xsl:template>

<xsl:template match="br" mode='PageOutput'>
    <xsl:value-of select="' '" />
</xsl:template>

提案されただましのように要素を無視しているのではなく、むしろ代用しているので、これはまったく正しくないようです。

4

1 に答える 1

3

「misc-item」を選択して変数を作成すると、br タグと fraction タグが消えます。ただし、「misc-item/br」を使用して変数を作成し、それが br を見つけるかどうかをテストすると、テストは機能するようです。

変数を作成すると、misc-itemノードへの参照が変数に格納されます。そのノードを要求するとvalue-of、要素が取り除かれたテキストだけが取得されますが、変数はノード自体を保持しています。

apply-templatesこれはおそらく、代わりに を使用して取り組む必要があるものですvalue-of。共通のテーマは、本質的にすべてをそのままコピーする「ID テンプレート」を持つことですが、より具体的なテンプレートを提供することで、特定のノードに対して異なる動作で上書きすることができます。

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

<!-- replace any br element with a semicolon -->
<xsl:template match="br">;</xsl:template>

モードを使用して、これらのテンプレートを特定の状況でのみ使用するように制限できます

<xsl:template match="@*|node()" mode="strip-br">
  <xsl:copy><xsl:apply-templates select="@*|node()" mode="strip-br" /></xsl:copy>
</xsl:template>

<!-- replace any br element with a semicolon -->
<xsl:template match="br" mode="strip-br">;</xsl:template>

そして今、あなたは例えば使用することができます

<xsl:apply-templates select="$miscitem/node()" mode="strip-br" />

<xsl:value-of select="$miscitem"/>あなたが求めている結果を得る代わりに。

于 2013-11-12T17:40:40.597 に答える