2012-05-25 2 views
2

나는이 문제에이 질문에 대한 정확한, 간단한 대답을 찾는 했어 SO 또는 다른 곳에서 :XSL 처리 주문

XSL 파일에서

, 당신은 어떻게하는 템플릿 둘째, 먼저 처리됩니다 말할 수, 등? XPath가 얼마나 구체적인지에 따라 정렬되었다고 읽었습니다. 또한 XSL 1.0과 2.0의 차이점은 무엇입니까?

마지막으로, 여기에 내가 멍청한 결함있는 XSL 파일이 있습니다. 현재 출력물은 "목차"제목 일뿐입니다. 여기에도 XML을 첨부 할 것입니다.

<xsl:template match="/"> 
    <h1> 
     <xsl:text>Table of Contents</xsl:text> 
    </h1> 
</xsl:template> 

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

<p> 
    <xsl:text>This document contains </xsl:text> 
    <xsl:value-of select="count(/article/body/heading1)"/> 
    <xsl:text> chapters. </xsl:text> 
</p> 

와 XML :

<article> 
<title> 
    Creating output 
</title> 
<body> 
    <heading1>Generating text</heading1> 
    <heading1>Numbering things</heading1> 
    <heading1>Formatting numbers</heading1> 
    <heading1>Copying nodes from the input document to the output</heading1> 
    <heading1>Handling whitespace</heading1> 
</body> 

이에 관해서는 어떤 설명이 왜 내용이

표시되지 않는 모든? 도와 줘서 고마워!

답변

4

여기에 무슨 일이 일어나고있는 작업은 다음과 같습니다

  1. XSLT 프로세서는
  2. 그런 다음이 일치하는 것을 확인하기 위해 스타일 시트에 보이는 당신의 XML의 루트 요소를 읽습니다. 첫 번째 템플릿을 찾습니다.
  3. 첫 번째 템플릿을 실행합니다.
  4. 첫 번째 템플릿은 텍스트를 출력하고 나머지는 수행하지 않으므로 XSLT 프로세서는 다음 입력 요소로 이동합니다. 그러나 전체 루트 노드를 처리 했으므로 더 이상 입력 노드가 없습니다. 같은 수준. 끝났다.

당신이해야 할 일은 <xsl:apply-templates/>을 첫 번째 템플릿 안에 넣는 것입니다. 프로세서에서이 문제가 발생하면 다시 시작되지만 이번에는 콘텍스트가 두 번째 레벨 노드의 목록입니다 루트가됩니다. 차례로 각 XML 노드를보고, 스타일 시트에서 가장 일치하는 템플릿을 찾아 실행합니다.

이것은 주요 개념입니다. 템플릿은 통제 할 수없고 절차가 아닙니다.

+0

매우 흥미 롭습니다! XSLT의 본질을 잊어 버렸습니다. 그 xsl : apply-templates를 어느 시점에서 사용해야합니까? 분명히 나는 ​​한 번 깊이 당 한 곳에서 그 모든 것을 뒤덮어주지 않습니까? (더 큰 문서가 주어짐) – BlackVegetable

+2

사실, 그렇습니다. 이 재귀 호출 기술은 XSLT 프로세서가 데이터를 템플릿에 "푸시"하게 해주기 때문에 "푸시"처리로 알려져 있습니다. 그것은 프로세서가 작동하는 자연스러운 방식이므로, 잘 디자인 된 스타일 시트는'apply-templates'로 "뒤죽박죽"될 것입니다. 다른 방법은'for-each'와'call-template'을 중첩시킨 "pull"스타일을 사용하는 것입니다.하지만 pull-style 처리의 힘을 이해할 때 매우 부자연 스럽습니다. –

+1

대답의이 비트는 "XSLT 프로세서가 다음 입력 요소로 이동합니다"라는 잘못된 답변입니다. 아니오 : 그렇지 않습니다. xsl : apply-templates를 사용하여 요청한 곳으로 만 이동합니다. –