문제

기본적으로 나는 다음과 같은 작은 템플릿이 있습니다.

<xsl:template name="templt">
    <xsl:param name="filter" />
    <xsl:variable name="numOrders" select="count(ORDERS/ORDER[$filter])" />
</xsl:template>

그리고 나는 그것을 사용한다고 부르려고 노력하고 있습니다

<xsl:call-template name="templt">
    <xsl:with-param name="filter" select="PRICE &lt; 15" />
</xsl:call-template>

불행히도 인용구로 템플릿을 호출하기 전에 (효과적으로 "false"가 전달되기 전에) 그것을 평가하는 것 같습니다. 내가 달성하려는 것이 가능하다면 아무도 아는 사람이 있습니까? 그렇다면 당신은 그것에 대해 약간의 빛을 흘릴 수 있습니까? 건배

도움이 되었습니까?

해결책

다음은 어떻습니까 :

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template name="templt">
    <xsl:param name="filterNodeName" />
    <xsl:param name="filterValue" />
    <xsl:variable name="orders" select="ORDERS/ORDER/child::*[name() = $filterNodeName and number(text()) &lt; $filterValue]" />
    <xsl:for-each select="$orders">
      <xsl:value-of select="."/>
    </xsl:for-each>
  </xsl:template>

  <xsl:template match="/">
    <xsl:call-template name="templt">
      <xsl:with-param name="filterNodeName" select="'PRICE'" />
      <xsl:with-param name="filterValue" select="15" />
    </xsl:call-template>
  </xsl:template>
</xsl:stylesheet>

여전히 단일 매개 변수 만 사용하려면 먼저 템플릿 '템플'에서 토큰 화를 할 수 있습니다.

다른 팁

디보의 대답은 좋은 것입니다.

그러나 아동의 이름과 가치를 지정하도록 최종 필터링을 제한합니다.

매개 변수로 기능을 전달할 수 있다는 것을 아는 것이 좋습니다.. 이 매우 강력한 개념은 구현됩니다 fxsl - XSLT 용 기능 프로그래밍 라이브러리. FXSL은 전적으로 XSLT 자체로 작성됩니다.

다음은 사용하는 적절한 예입니다 필터 기능/템플릿. 필터를 필터링을 수행하는 템플릿으로 매개 변수로 필터를 전달합니다. 필터는 모든 코드/로직이 될 수 있습니다. 이 특별한 경우 우리는 매개 변수로 전달하여 숫자가 짝수지 확인하는 템플릿에 대한 참조를 전달합니다. 완전한 변환은 값이 짝수 인 "num"요소 만 출력합니다.

우리는 다른 필터를 매우 쉽게 통과 할 수 있습니다, 정확히 동일한 기술 사용 : 짝수 (un) 숫자, 사각형, 소수, ... 등을 필터링합니다.

"필터"템플릿을 스스로 쓸 필요가 없다는 점에 유의하십시오. - 한 번 그리고 영원히 작성되었으며 FXSL 라이브러리가 제공합니다. 결과적으로 일반적으로 사용합니다u003Cxsl:import/> "필터"템플릿을 가져 오는 지침 및 FXSL이 이미 제공 한 기타 유용한 기능/템플릿을 가져옵니다.

아래 변환 :

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:f="http://fxsl.sf.net/"
xmlns:myIsEven="myIsEven"
>

  <xsl:import href="filter.xsl"/>

  <!-- To be applied on numList.xml -->

  <xsl:output indent="yes" omit-xml-declaration="yes"/>

  <myIsEven:myIsEven/>

  <xsl:template match="/">
    <xsl:variable name="vIsEven"
         select="document('')/*/myIsEven:*[1]"/>

    Filtering by IsEven:
    <xsl:call-template name="_filter">
        <xsl:with-param name="pList" select="/*/*"/>
        <xsl:with-param name="pController" select="$vIsEven"/>
    </xsl:call-template>

  </xsl:template>

  <xsl:template name="myIsEven" mode="f:FXSL"
    match="myIsEven:*">
    <xsl:param name="arg1"/>

    <xsl:if test="$arg1 mod 2 = 0">1</xsl:if>
  </xsl:template>
</xsl:stylesheet>

이 소스 XML 문서에 적용될 때 :

<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>10</num>
</nums>

균일 한 값을 가진 노드 만 포함하는 원하는 (필터링 된) 결과를 생성합니다.

Filtering by IsEven:
<num>02</num>
<num>04</num>
<num>06</num>
<num>08</num>
<num>10</num>

XSLT의 기능 프로그래밍에 대한 자세한 내용은 fxsl 페이지 그리고 라이브러리 자체는 그것에서 다운로드 할 수 있습니다 Sourceforce 프로젝트.

구체적인 문제로 돌아 가기 위해 :

이 변형 :

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:f="http://fxsl.sf.net/"
xmlns:myFilter="myFilter"
>

  <xsl:import href="filter.xsl"/>

  <!-- To be applied on Orders.xml -->

  <xsl:output indent="yes" omit-xml-declaration="yes"/>

  <myFilter:myFilter/>

  <xsl:template match="/">
    <xsl:variable name="vFilter"
         select="document('')/*/myFilter:*[1]"/>

    Filtering by PRICE < 15:
    <xsl:call-template name="_filter">
        <xsl:with-param name="pList" select="/*/*"/>
        <xsl:with-param name="pController" select="$vFilter"/>
    </xsl:call-template>

  </xsl:template>

  <xsl:template name="myFilter" mode="f:FXSL"
    match="myFilter:*">
    <xsl:param name="arg1"/>

    <xsl:if test="$arg1/PRICE &lt; 15">1</xsl:if>
  </xsl:template>
</xsl:stylesheet>

이 소스 XML 문서에 적용될 때 :

<ORDERS>
  <ORDER>
    <PRICE>10</PRICE>
  </ORDER>
  <ORDER>
    <PRICE>7</PRICE>
  </ORDER>
  <ORDER>
      <PRICE>22</PRICE>
</ORDER>
  <ORDER>
      <PRICE>16</PRICE>
  </ORDER>
  <ORDER>
      <PRICE>13</PRICE>
  </ORDER>
  <ORDER>
      <PRICE>19</PRICE>
  </ORDER>
</ORDERS>  

원하는 결과를 생성합니다.

Filtering by PRICE < 15:
<ORDER>
   <PRICE>10</PRICE>
</ORDER>
<ORDER>
   <PRICE>7</PRICE>
</ORDER>
<ORDER>
   <PRICE>13</PRICE>
</ORDER>

Exslt 라이브러리, 특히 Dyn : 평가 함수는 문자열을 XPath 표현식으로 평가할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top