0

(ここのすべてのコードは元のバージョンから単純化されています)

私の会社には、XSLT (1.0) で使用される関数があり、ファイル システムからファイルのコンテンツを返します。を使用して関数の戻り値を解析できる必要がありますapply-templates。次の例を検討してください。

メイン XML ファイル:

<exhibit>
    <exhibitTitle>Exhibit</exhibitTitle>
    <linkedAsset href="path/to/file.xml" />
</exhibit>

外部 XML ファイル:

<externalAsset editable="true" id="U10250926378W6C">
    <img src="path/to/image.png" />
    <caption>Some default image</caption>
<externalAsset>

次の XSLT をメインの XML ファイルに適用してみました。

XSLT:

<xsl:template match="linkedAsset">
    <xsl:apply-templates select="cus:getFileByUri(./@href)" />
</xsl:template>

<xsl:template match="img">
    <xsl:text>|-- Begin Image Source --|</xsl:text>
    <xsl:value-of select="./src" />
    </xsl:text>|-- End Image Source --|</xsl:text>
</xsl:template>

結果は単に「デフォルトのイメージ」でした。

すべてのノード (または何か) の値だけでなく、XML 構造を取得していることを確認するために、次のことを試しました。

<xsl:template match="linkedAsset">
    <xsl:copy-of select="cus:getFileByUri(./@href)" />
</xsl:template>

元の外部 XML ファイル構造を返したもの:

<externalAsset editable="true" id="U10250926378W6C">
    <img src="path/to/image.png" />
    <caption>Some default image</caption>
<externalAsset>

私も試しました:

<xsl:template match="linkedAsset">
    <xsl:value-of select="cus:getFileByUri(./@href)//img/@src" />
</xsl:template>

期待どおり「path/to/image.png」を返しました。

最後に、この質問の回答に基づいて、次の XSLT を試しました。

<xsl:template match="linkedAsset">
    <xsl:call-template name="renderExternal">
        <xsl:with-param name="asset" select="cus:getFileByUri(./@href)" />
    </xsl:call-template>
</xsl:template>

<xsl:template name="renderExternal">
    <xsl:param name="asset" select="." />
    <xsl:apply-templates select="$asset" />
</xsl:template>

出力はオリジナルと同じでしたapply-template

apply-templates関数から返された値に適用する方法はありますか? copy-of文字列を、に明確に送信し、value-ofさらに xpath を実行することもできます。私は単にそれを使用しないことはできapply-templatesますか?


選択した回答の説明

結局のところ、私の問題の解決策は非常に具体的でした (同じテンプレートに一致するノードにテンプレートを適用していましたが、提供したコードの単純化されたバージョンからは明らかではありません)。私は本当にこれで-1を獲得しました。 とにかく、 keshlamの答えは、私の問題だと思っていたことに答えるので、将来この質問にアクセスする人々にとって最も役立つと思います。

4

1 に答える 1

1

それに対して apply-templates を実行するには、拡張機能は既に解析された形式 (通常は DOM ツリーまたは NodeIterator) で XML をスタイルシートに返す必要があります。XSLT 1.0 では、exslt:node-set()拡張機能またはプロセッサの同等のつまり、一時ツリーとノード セットの間のインピーダンスの不一致を処理するためです (xsl:apply-templates はノードセットで動作します)。

拡張機能の作成と登録の詳細は、プロセッサによって異なる場合があります。たとえば、Xalan-J を使用している場合は、https://xml.apache.org/xalan-j/extensions.htmlを参照してください。

于 2014-02-19T22:52:48.973 に答える