1

ノード リストとそのリスト内の現在のノードが与えられた場合、javax.xml.xpath (またはおそらく org.apache.xpath) を使用して、位置に依存する XPath 式を評価する方法はありますか。次に例を示します。

position()=last()-1

javax.xml.xpath には以下が含まれます。

evaluate(String expression, Object item, QName returnType) 指定されたコンテキストで XPath 式を評価し、指定された型として結果を返します。

私は一時的なノードを作成し、ノードリストにノードを子として追加し、現在のノードに対応する子をコンテキストとして評価するために渡すことができると思いますが、(それでもうまくいくと仮定して)より良い方法はありますか?

あるいは、XSLT 1.0 で、これら 3 つのもの (ノード リスト、ノード、および xpath 式 (文字列として)) を変数として持っているとします。ノードリストをコンテキストとして使用して、この式をノードに適用し、結果を変数として取得することは可能ですか?

4

3 に答える 3

3

ほとんどのXPathAPI、そして確かにJAXP APIでは、シングルトンフォーカス、つまり、コンテキストアイテムとして任意のアイテムを選択できるフォーカスのみを設定できますが、コンテキストの位置とサイズは1に固定されています。

于 2012-07-12T16:01:39.723 に答える
1

Xalan Java はhttp://www.exslt.org/dyn/functions/evaluate/index.htmlをサポートしているため、たとえば次のように使用できるはずです。

<xsl:variable name="nodes" select="/root/foo/bar"/>
<xsl:variable name="expression" select="concat('$nodes/', $yourPath)"/>
<xsl:variable name="result" select="dyn:evaluate($expression)"/>

xmlns:dyn="http://exslt.org/dynamic"もちろん定義済み)。

それは役に立ちますか?ノードリストと単一のノードを持ち、両方をコンテキストとして使用したいというセクションを理解しているかどうかはわかりません。

Java 側に関しては、DOM NodeList の最後のノードの前にあるノードを見つけるだけではnodeList.getItem(nodeList.getLength() - 2)十分ではありませんか?

于 2012-07-12T14:28:17.727 に答える
0

7 年前のこの投稿は、Xalan 固有の非 XSLT ソリューションが利用可能である可能性があることを示唆していますが、実装の独立性と Michael の反応により、動作する XSLT1 ベースのソリューションを探す方向に進みました。

ここにあります; 他の人にとって役に立つかどうかはわかりません。もっと簡単な方法があるのだろうか?

すべてが正しく設定されていれば、XSLT を利用できます。仕様から:

XSLT では、最も外側の式 (つまり、別の式の一部ではない式) は、次のようにコンテキストを取得します。

コンテキスト ノードは現在のノードから取得されます

コンテキスト位置は、現在のノード リスト内の現在のノードの位置から取得されます。最初の位置は 1

最後に、式 $expression を変数 $result に適用した結果を取得します。

        <xsl:variable name="result" >
            <xsl:apply-templates select="$vNodeSet" mode="myeval">
                <xsl:with-param name="expression" ><xsl:value-of select="$expression"/></xsl:with-param>
                <xsl:with-param name="pos" ><xsl:value-of select="$pos"/></xsl:with-param>
            </xsl:apply-templates>
        </xsl:variable> 

その apply-templates は、適切な「現在のノード リスト」を次のテンプレートにプッシュします。

  <xsl:template match="*" mode="myeval">
    <xsl:param name="expression">1. </xsl:param>
    <xsl:param name="pos">3</xsl:param>

    <xsl:choose>
        <xsl:when test="position()=$pos">
            <xsl:value-of select="dyn:evaluate($expression)" /></xsl:when>
        <xsl:otherwise /> 
    </xsl:choose>

  </xsl:template>

このテンプレートは、「現在のノード」にしたいノードの式を評価します。知らせ:

  1. dy:evaluate の使用 (Martin に感謝!)
  2. $pos は、現在のノードとして必要なものを識別します。

以前の質問に対する Dimitre の回答を使用して $pos を計算できました。彼の変数名 vNodeSet も使用しました

Dimitre、Martin、Michael に感謝します。

于 2012-07-13T04:57:04.750 に答える