2013-02-06 3 views
1

나는이 같은 XML이 :xsl : 자체적으로 생성 된 노드에서 xsl : apply-templates를 사용하려면 어떻게해야합니까?

<span reference="1">Reference Text 1</span> 
<term reference="2">Reference Text 2</term> 

을 그리고 나는 그것이이 될 필요가 다음 reference 속성을 가진 요소가 범위 인 경우

그래서
<span class="referenceText">Reference Text 1</span> <a href="1">[1]</a> 
<i>Reference Text 2</i> <a href="2">[2]</a> 

, 기본적으로, 우리는 그냥두고 있는 그대로, class="referenceText"을 추가하십시오. 그러나 다른 요소 인 경우이 요소에 대해 생성 된 템플릿을 적용해야합니다. <term><i>가되어야하는 이유입니다 - 나는 그것에 대한 템플릿이 있습니다

<xsl:template match="*[@reference]"> 

    <xsl:param name="href" select="./@reference"/> 

    <xsl:choose> 
    <xsl:when test="name() = 'span'"> 
     <span class="referenceText"> 
     <xsl:value-of select="."/> 
     </span> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:element name="{name()}"> 
     <xsl:value-of select="."/> 
     </xsl:element> 
    </xsl:otherwise> 
    </xsl:choose> 

    <xsl:text> </xsl:text><a href="#{$href}">[<xsl:value-of select="./@href"/>]</a> 

</xsl:template> 

불행하게도,이 결과 :이 템플릿을 가지고 "참조"태그를 가진 모든 요소의 변화에 ​​대한

<xsl:template match="term"> 
    <i><xsl:apply-templates select="@* |node()"/></i> 
</xsl:template> 

을 folllowing OUPUT는 :

<span class="referenceText">Reference Text 1</span> <a href="1">[1]</a> 
<term>Reference Text 2</term> <a href="2">[2]</a> 

그래서, <term><i>로 변환되지 않습니다. 생성 된 것에 템플릿을 다시 적용하기 위해 재귀가 필요하다고 생각 되나 아무것도 만들 수 없습니다.

답변

1

XSLT 1.0을 사용하는 경우 변수에 출력을 캡처 한 다음 exslt:node-set 함수를 사용하여 변수에 템플릿을 적용 할 수 있습니다. 그래도 무한 재귀를 피하십시오.

<xsl:variable name="foo"> 
... 
</xsl:variable> 
<xsl:apply-templates select="exslt:node-set($foo)"/> 
+0

내 코드에서이 작업을 수행하는 방법을 보여 줄 수 있습니까? 방금 시도했지만 제대로 작동하지 않는 것 같습니다. 거의 모든 결과 문서가 사라집니다. – snitko

+0

exslt 네임 스페이스를 정의하려면 루트 요소 (또는 다른 곳)에 xmlns : exslt = "http://exslt.org/common"을 추가해야합니다. 어떤 XSLT 프로세서를 사용하고 있습니까? –

+0

'libxslt'을 사용하고 있습니다. 루트 요소에'xmlns : exslt = "exslt.org/common"'을 추가하려고 시도했지만 행운은 없습니다. – snitko