2009-06-07 8 views
1

XPath 2.0 fn : max 함수처럼 작동하는 XPath 함수를 검색하고 있습니다. 최대 몇 개의 매개 변수를 반환하는 함수입니다.XPath 1.0 EXSLT를 사용하는 변수의 최대 함수

<?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 : node-set은 ** 순수하게 ** 내가 가지고 있어야하는 IDE이기 때문에 **; 내가 언급 한 것처럼, 노드 집합도 마찬가지로해야한다. 나는 단순히 exslt로 테스트 할 수 없으며 테스트 된 답변을 게시하고 싶습니다. –

1

내가 앞에 내 XSLT 1.0 책이없는이 저,하지만 여기서 핵심은 '노드 세트'를 선택하고 매개 변수 당 하나의 노드가 아닌 매개 변수 변수와 동일한 값을 설정한다는 것입니다. 다음은 대략적인 추측 :

<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= 속성을 사용하여 비교할 노드를 자동으로 선택할 수 있습니다.

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, 이것은 대답이 아닌 질문에 대한 업데이트로 더 좋을 것입니다. –