2011-12-17 3 views
4

호출 템플릿의 결과에 템플릿을 적용 할 수 있습니까?XSLT - 호출 템플릿 결과에 템플릿 적용

예를 들어 아래의 xml과 2xslt.

이 Index.xml :

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <book> 
    <title>Ethics</title> 
    </book> 
    <book> 
    <title>Beyond Good and Evil</title> 
    </book> 
</root> 

index2.xsl

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:template match="/" name="temp2"> 
    <foo> 
    <xsl:for-each select="//book"> 
     <bar><xsl:value-of select="."/></bar> 
    </xsl:for-each> 
    </foo> 
    </xsl:template> 
</xsl:stylesheet> 

및 index.xsl 호출하는 index2.xsl

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
<xsl:include href="index2.xsl" /> 
<!-- apply a template to the <xsl:call-template name="temp2" /> result --> 
</xsl:stylesheet> 

는에 템플릿을 적용 할 수있는 방법이 있습니까 index.xsl에 <xsl:call-template name="temp2" />의 결과가 있습니까?

미리 감사드립니다.

답변

8

index.xsl에서 <xsl:call-template name="temp2" />의 결과에 템플릿을 적용 할 수있는 방법이 있습니까?

는 네,멀티 패스 처리 불린다. 유일하게 특이한 점은 XSLT 1.0에서는 일반적으로 악명 높은 RTF (Result Tree Fragment) 유형의 중간 결과에 구현 종속적 인 xxx:node-set() 확장 함수를 적용해야하므로 일반 트리로 변환해야한다는 것입니다. 여기

멀티 패스 처리의 완벽한 예입니다 (나는 xsl:apply-templates하지 xsl:call-template를 사용하고,하지만 당신은 자유롭게라는 이름의 템플릿과 xsl:call-template 대신 사용이 예제를 수정할 수 있습니다) :

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/*"> 
    <xsl:variable name="vrtfPass1"> 
    <xsl:apply-templates select="num"/> 
    </xsl:variable> 

    <xsl:apply-templates mode="pass2" 
    select="ext:node-set($vrtfPass1)/*"/> 
</xsl:template> 

<xsl:template match="num"> 
    <num><xsl:value-of select="2* ."/></num> 
</xsl:template> 

<xsl:template match="num" mode="pass2"> 
    <num><xsl:value-of select=". * ."/></num> 
</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> 

원하는 결과 (해당 num 원소의 함량이 상기 제 패스 배로부터, 제 2 패스에서 제곱)는 생산된다

<num>4</num> 
<num>16</num> 
<num>36</num> 
<num>64</num> 
<num>100</num> 
<num>144</num> 
<num>196</num> 
<num>256</num> 
<num>324</num> 
<num>400</num> 

을 II. XSLT 2.0

는 다음과 동등한 변화와 같이, 기능적 조성물 거의 구별된다 멀티 패스 처리을 지정하는 더 용이하므로 RTF "타입"이 폐지되었다

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="my:my" exclude-result-prefixes="my"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/*"> 
    <xsl:sequence select="my:squareAll(my:doubleAll(*))"/> 
</xsl:template> 

<xsl:function name="my:doubleAll" as="element()*"> 
    <xsl:param name="pElems" as="element()*"/> 

    <xsl:for-each select="$pElems"> 
    <xsl:copy> 
    <xsl:sequence select=". + ."/> 
    </xsl:copy> 
    </xsl:for-each> 
</xsl:function> 

<xsl:function name="my:squareAll" as="element()*"> 
    <xsl:param name="pElems" as="element()*"/> 

    <xsl:for-each select="$pElems"> 
    <xsl:copy> 
    <xsl:sequence select=". * ."/> 
    </xsl:copy> 
    </xsl:for-each> 
</xsl:function> 
</xsl:stylesheet> 

이러한 변화는 동일한 XML 문서 (위)에인가되는 경우, 동일한 결과가 정확한 생산 :

<num>4</num> 
<num>16</num> 
<num>36</num> 
<num>64</num> 
<num>100</num> 
<num>144</num> 
<num>196</num> 
<num>256</num> 
<num>324</num> 
<num>400</num> 
+0

을 쉬게 ry 명확하고 상세한 설명, 많이 고마워! – Eric