2

かなり簡単な解決策があるはずですが、うまくいきません。

これは私のコードです:

<xsl:value-of select="$currentPage/ancestor-or-self::* [@isDoc and backgroundImage != '' and string(umbracoNaviHide) != '1']/backgroundImage"/>

私が望むのは、プロパティ backgroundImage によってノードに背景画像が添付されている場合、その画像を使用することです。背景画像がない場合は、背景画像の親ノードを確認し、それを使用します。

ノード自体に背景画像がある場合でも、親の背景画像を常にチェックします。

これを解決する方法について何か提案はありますか?

アップデート

<site id="1000" ...>
    <backgroundImage>/media/image.jpg</backgroundImage>
    <textPage id="1001" ...>
        <backgroundImage>/media/image2.jpg</backgroundImage>
    </textPage>
    <textPage id="1002" ...>
        <backgroundImage />
    </textPage>
</site>

backgroundImage が nullの場所にいる場合<textPage id="1002">、から image.jpg を取得したいと思います<site id="1000">

backgroundImage が null でない場所にいる場合は<textPage id="1001">、image2.jpg を取得したいと思います。

4

2 に答える 2

4

XPath アドレスに適用された数値述語は近接順に処理されますが、アドレス指定された結果のノードは文書順に XSLT プロセッサに渡されます。

XSLT 1.0 では、<xsl:value-of>返されたノードの最初のものを返すため、ドキュメント順で最初のノードが返されます。そのため、すべての先祖または特定のプロパティで自己をアドレス指定している場合、最も近いノードではなく、最も遠いノードが取得されます。XSLT 2.0 では、それらすべてを取得できます。

述語は近接順に適用されるため、次を使用するだけです。

<xsl:value-of select="$currentPage/ancestor-or-self::*[...whatever...][1]"/>

... "whatever" 述語によって示されるプロパティを持つ最も近いものを取得します。

フランクのソリューションで機能する理由[last()]は、括弧が囲まれたノードをドキュメントの順序で返すため、それらの最も近いノードが最後になるためです。

しかし、セマンティクスの観点からは、単純に最初に近い順にアドレス指定する方が読みやすいと思います。

于 2013-08-10T00:05:25.607 に答える
0

試す

<xsl:value-of select="($currentPage/ancestor-or-self::* [@isDoc and backgroundImage != '' and string(umbracoNaviHide) != '1'])[last()]/backgroundImage"/>

コードで条件を満たす現在の要素を含むすべての祖先のシーケンスを取得します。関数を追加するlast()と、条件を満たしているこのシーケンスの最後の項目が取得されます。

于 2013-08-09T21:15:34.957 に答える