1

この質問はXSL store node-set in variableによく似ています。主な違いは、XPath がフィルターに一致するノードを見つけられない場合、フィルター処理されていない最初の結果を返したいということです。

ここにあるコードは機能しますが、ハックであり、XSL スタイルが適切ではないように感じます。この場合、各章ノードは文字列 ID で識別されます。変数showChapterは章を識別する文字列です。この id 属性を持つ章が見つからない場合は、最初の章を返したいと思います。

関連コード:

<xsl:param name="showChapter" />

<!-- if $showChapter does not match any chapter id attribute, 
     set validShowChapter to id of first chapter. 
-->

<xsl:variable name="validShowChapter">
    <xsl:choose>
        <xsl:when test="/book/chapter[@id=string($showChapter)][position()=1]">
            <xsl:value-of select="$showChapter" />
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="/book/chapter[position()=1]/@id" />
        </xsl:otherwise>
    </xsl:choose>
</xsl:variable>

<!-- I want $chapter to be a valid node-set so I can use it in 
     XPath select statements in my templates 
-->
<xsl:variable 
    name="chapter"
    select="/book/chapter[@id=string($validShowChapter)][position()=1]"
>

このアプローチは、私が思うほどハックが貧弱ですか? もしそうなら、より良い解決策を教えてもらえますか? PHP5 の XSLTProcessor で処理された XSLT 1.0 を使用していますが、XSLT 2.0 ソリューションは大歓迎です。

4

1 に答える 1

1

以下が機能するはずです。position()あなたの例では、の多くの使用法string()は不要でした、ところで:

<xsl:param name="showChapter" />

<xsl:variable name="foundChapter" select="/book/chapter[@id = $showChapter]" />
<!-- Will select either the first chapter in $foundChapter, or
     the first chapter available if $foundChapter is empty -->
<xsl:variable name="chapter" 
              select="($foundChapter | /book/chapter[not($foundChapter)])[1]" />
于 2013-03-04T06:42:27.187 に答える