2012-03-30 4 views
17

XSLT 1.0에서 현재 컨텍스트 노드를 호출 된 템플릿에 전달하고 해당 노드를 호출 된 템플릿의 컨텍스트 노드가되도록하려면 가장 짧고/가장 깨끗한/권장되는 방법은 무엇입니까?XSLT call-template의 현재 컨텍스트 전달

xsl : param이없고 빈 호출 템플릿에 의해 호출 된 템플릿이 호출자의 컨텍스트 노드를 선택하는 것이 좋지만 내가 생각할 수있는 최선의 방법은 다음과 같습니다.

<xsl:template name="sub"> 
    <xsl:param name="context" /> 
    <xsl:for-each select="$context"> 

    </xsl:for-each> 
</xsl:template> 

답변

22

<xsl:call-template name="sub"> 
     <xsl:with-param name="context" select="." /> 
    </xsl:call-template> 

call-template에 의해 호출없이 xsl:param 하고있는 템플릿이 단순히 선택한다면 그것은 (는 것, 바로?) 좋을 것 발신자의 컨텍스트 노드

xsl:call-template는 W3C XSLT 1.0 (2.0) 스펙에서 정의하고있는 호환 XSLT 프로세서 구현 정확히 어떻게

. 원하는 정확한 결과를 제작

<t> 
<a/> 
</t> 

:

이 변환은 다음과 같은 XML 문서에인가

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:template match="a"> 
    <xsl:call-template name="currentName"/> 
</xsl:template> 

<xsl:template name="currentName"> 
    Name: <xsl:value-of select="name(.)"/> 
</xsl:template> 
</xsl:stylesheet> 

: 여기

작은 예이며
+0

감사합니다. Dimitre. 나는 이것이 문서화 된 것을 보지 못했고 시도했을 때 제대로 작동하지 않는 것 같았다. 나는 올바른 곳을보고 있지 않았으며 다른 잘못된 것을하고 있었음에 틀림 없다. +1 질문에 답변했습니다. 건배. – JPM

+0

@ JPM : 천만에요. XSLT 2.0의'xsl : function' 명령을 살펴봤을 수도 있습니다 - 함수의 호출자 컨텍스트를받지 못하고 호출자가 컨텍스트 노드를 전달해야한다는 점에서 명명 된 템플릿과 다릅니다 이 컨텍스트 노드를 전달해야하는지 여부를 매개 변수로 사용합니다. –

4

디미트리 (Dimitre)가 말한 것을 설명하는 단지 다른 방법.

<xsl:template match="MyElement"> 
    <xsl:call-template name="XYZ"/> 
</xsl:template> 

<xsl:template name="XYZ> 
    <xsl:value-of select="."/> 
</xsl> 

위의 코드 쓰기만큼 좋은 :

이 코드를 가정하면 노드에서 템플릿을 호출하면

, 당신은

예, 해당 노드에 이미 있습니다 :

<xsl:template match="MyElement"> 
    <xsl:value-of select="."/> 
</xsl:template> 

호출 된 템플릿에서도 for-each 루프를 사용할 수 있습니다. :)

정확히 어디 있는지 정확히 알 수 있습니다.

관련 문제