2009-06-07 12 views
1

私はXPath 2.0 fn:max関数のように動作するXPath関数を処理しています。いくつかのパラメータの最大値を返す関数。私の最大の機能は、複数の要素を取ることができるようにXPath 1.0 EXSLTを使用する変数のmax関数

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:math="http://exslt.org/math" 
xmlns:exslt="http://exslt.org/common" 
xmlns:func="http://exslt.org/functions" 
xmlns:my="http://myns.com" 
extension-element-prefixes="math exslt func"> 

    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

    <xsl:template match="/"> 
     <root> 
      <xsl:value-of select="my:max(1,2)"/> 
     </root> 
    </xsl:template> 


    <func:function name="my:max"> 
     <xsl:param name="e1"/> 
     <xsl:param name="e2"/> 

     <xsl:variable name="x"> 
      <val><xsl:value-of select="$e1"/></val> 
      <val><xsl:value-of select="$e2"/></val> 
     </xsl:variable> 

     <func:result select="math:max(exslt:node-set($x)/val)"/> 
    </func:function> 
</xsl:stylesheet> 

はそれを行うことが可能です:私はこの方法を考え出した多くのことを検索した後

乾杯

答えて

0

おそらくあなたは、入力引数として(ノードセット用)のxmlを指定することができますか?

私が「アップ」EXSLTにないんだけど、(ちょうどEXSLTでもあるnode-set機能、など)msxslを使用して:

<xsl:template name="max"> 
    <xsl:param name="values"/> 
    <xsl:for-each select="msxsl:node-set($values)/val"> 
     <xsl:sort data-type="number" order="descending"/> 
     <xsl:if test="position()=1"> 
     <xsl:value-of select="."/> 
     </xsl:if> 
    </xsl:for-each> 
    </xsl:template> 
    ... 
    <xsl:call-template name="max"> 
    <xsl:with-param name="values"> 
     <val>13</val> 
     <val>123</val> 
     <val>18</val> 
    </xsl:with-param> 
    </xsl:call-template> 
+0

MS-XSLはまったく間違っているようです。 –

+1

msxsl:ノードセットは**純粋に**私が手にしなければならないIDEなので、私が言及したと信じているように、exslt:node-setも同様にすべきである。私は単にexsltでテストすることはできません。私はむしろ、テストされた答えを投稿したいと思います。 –

1

私は目の前で私のXSLT 1.0の本を持っていませんここで重要なのは、「ノードセット」を選択して、パラメータごとに1つのノードを持つよりも、それらをパラメータ変数と同じに設定できることです。

<xsl:template match="/"> 
    <root> 
     <xsl:call-template name="max"> 
     <xsl:with-param name="values"> 
      <val>1</val> 
      <val>2</val> 
      <val>3</val> 
     </xsl:with-param> 
     </xsl:call-template> 
    </root> 
</xsl:template> 


<func:function name="my:max"> 
    <xsl:param name="x"/> 

    <func:result select="math:max($x/val/*)"/> 
</func:function> 

が編集:いくつかのXSLT 1.0ガイダンスに沿って質問を再読み込み はここでラフな推測です。それは他の答えに似ているはずですが、わずかに単純化されています。 XMLデータから必要な数値を取得する場合は、select=属性(xsl:with-param)を使用して、比較するノードを自動的に選択することができます。

0

ありがとうございます。

あなたは私がすべてを少し良く理解するのを手伝ってくれました。しかし私の本来の目的は、 xsl変数で動作する便利なXPath関数を得ることでした。パラメータの固定アンバーのために

<!-- works with XPath 2.0 --> 
<xst:template match="img/@height"> 
    <xsl:variable name="$maximageheight" select="200"> 
    <xsl:value-of select="fn:max($maximageheight , .)"/> 
</xsl:template> 

<!-- until now the only way I see to do the same in XSL 1.0 --> 
<xst:template match="img/@height"> 
<xsl:variable name="$maximageheight" select="200"> 
    <xsl:call-template name="max"> 
    <xsl:with-param name="values"> 
     <val>$maximageheight</val> 
     <val><xsl:value-of select="."/></val> 
    </xsl:with-param> 
    </xsl:call-template> 
</xsl:template> 

EXSLTの機能を実現することができるようになります:

<func:function name="my:max" xmlns:func="http://exslt.org/functions"> 
    <xsl:param name="e1"/> 
    <xsl:param name="e2"/> 

    <xsl:variable name="x"> 
    <val><xsl:value-of select="$e1"/></val> 
    <val><xsl:value-of select="$e2"/></val> 
    </xsl:variable> 

    <func:result select="math:max(exslt:node-set($x)/val)"/> 
</func:function> 

しかし、私は、パラメータの可変数をVORそれを実装する方法が表示されません。

+0

それから、それはできないかもしれません... btw、これは答えではなく、質問の更新としては良いでしょう。 –

関連する問題