私の問題:
アトムRSSフィードファイルが豊富にあり、その中には多くの異なるアトムエントリがあり、ファイル間でいくつかの重複するエントリがあります。RSSフィードのいずれかからのURLに基づいてエントリを見つけて返す必要があります。
テクノロジー:
このコードは、XSLT1を使用するPHP5.2.10のXLSTProcessor拡張機能を介して実行され、EXSLTをサポートし、組み込みのPHP関数を実行する機能を備えています。Saxan、Xalan、または他の同様のソリューションは、この特定の状況ではあまり役に立ちません。
次のコードは大幅に簡略化されていますが、私の状況を表しています。
rss-feed-names.xml:
<feeds>
<feed name="travel.xml"/>
<feed name="holidays.xml"/>
...
<feed name="summer.xml"/>
<feed name="sports.xml"/>
</feeds>
stylesheet.xsl
<xsl:stylesheet ...>
...
<func:function name="cozi:findPost">
<xsl:param name="post-url"/>
<xsl:variable name="blog-feeds" select="document('rss-feed-names.xml')/feeds"/>
<xsl:for-each select="$blog-feeds/feed">
<xsl:variable name="feed-file" select="document(@name)/atom:feed"/>
<xsl:variable name="feed-entry" select="$feed-file/atom:entry[atom:link[contains(@href, $post-url)]]"/>
<xsl:if test="$feed-entry">
<func:result select="$feed-entry"/><!-- this causes errors if more than one result is found -->
</xsl:if>
</xsl:for-each>
</func:function>
</xsl:stylesheet>
...
このコードは、探しているアトムエントリが、調べているファイルの1つに表示されている場合に問題なく機能します。そのファイル内に複数回表示される場合がありますが、2つ以上のファイルに表示されるとすぐに、func:resultが既にインスタンス化されて上書きされているため、コードが壊れます。これはXSLTではノーノーです。
EXSLT関数またはxsl:for-each「ループ」を実際に終了する方法がある場合(関数に戻り変数を割り当てることはできますが、関数は続行されます。for-eachは実際にはループではありませんが、関数に似ています。マップ)、それは理想的ですが、私はまだ方法を見つけていません。
すべてのフィードを1つの変数に結合し、for-eachループを完全に削除することを検討しましたが、これを最初から機能させるのに問題がありました。
他の可能な解決策、アイデア、またはポインタは大歓迎です!ここでのファイルの関係とXMLを変更するのはかなり難しいため、そのような変更を提案するソリューションは理想的ではありません。
よろしくお願いします、
トリスタンイーストバーン