문제
기본적으로 나는 다음과 같은 작은 템플릿이 있습니다.
<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 < 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()) < $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 < 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 표현식으로 평가할 수 있습니다.