IT

XSL에서 'call-template'과 'apply-templates'의 차이점은 무엇입니까?

lottoking 2020. 7. 24. 07:28
반응형

XSL에서 'call-template'과 'apply-templates'의 차이점은 무엇입니까?


XSLT 처음에 두 태그에 대해 약간의 혼란스러워합니다.

<xsl:apply-templates name="nodes">

<xsl:call-template select="nodes"> 

그래서 당신은 그들 사이의 차이점을 사용할 수 있습니까?


<xsl:call-template> 함수를 호출하는 것과 거의 비슷합니다.

여기서는 간단한 함수와 같이 XSLT에서 함수를 정의 할 수 있습니다.

<xsl:template name="dosomething">
  <xsl:text>A function that does something</xsl:text>
</xsl:template>

이 함수는을 통해 호출 할 수 있습니다 <xsl:call-template name="dosomething">.

<xsl:apply-templates>XSLT의 숫자 인 힘은 조금씩. XSLT의 진정한 힘입니다. 많은 XML 노드 ( select속성에 정의 한대로)를 반복하고 반복합니다 ( 중요!는 루프처럼 작동합니다 템플릿 적용 ). 일치하는 템플릿을 찾습니다. 요구 위해 :

<!-- sample XML snippet -->
<xml>
  <foo /><bar /><baz />
</xml>

<!-- sample XSLT snippet -->
<xsl:template match="xml">
  <xsl:apply-templates select="*" /> <!-- three nodes selected here -->
</xsl:template>

<xsl:template match="foo"> <!-- will be called once -->
  <xsl:text>foo element encountered</xsl:text>
</xsl:template>

<xsl:template match="*"> <!-- will be called twice -->
  <xsl:text>other element countered</xsl:text>
</xsl:template>

이 방법으로 XSLT 프로세서를 약간 제어 할 수 있습니다. 프로그램의 위치를 ​​결정하는 것이 아니라 현재 처리중인 노드와 가장 일치하는 것을 찾아서 프로세서가 수행합니다.

여러 템플릿이 한 노드와 일치 할 수 있으면 구체적인 일치 표현이있는 템플릿이 우선합니다. 동일한 특이성을 가진 일치하는 템플릿이 둘 이상 존재하면 마지막으로 선언 된 템플릿이 우선합니다.

템플릿 개발에 더 집중할 수 있고 "배관 작업"에 소요되는 시간이 있습니다. XSLT 프로세서가 템플릿 일치에 최적화되어 있기 때문에 프로그램은 더욱 강력하고 모듈화되고 중첩이 적어지고 빨라 처리됩니다.

XSLT로 이해해야 할 개념은 "현재 노드"의 개념입니다. <xsl:apply-templates>현재 노드를 사용 하면 반복 할 때마다 이동하지만 현재 노드는 <xsl:call-template>변경되지 않습니다. 즉, .호출 된 템플릿 내에서 호출 된 템플릿과 노드를 나타냅니다 .. 적용-템플릿

이것이 기본적인 차이점입니다. 템플릿의 동작에 영향을 미치는 다른 곳이 있습니다. 템플릿 mode및 a priority, 템플릿에 a name와 a 가 모두있을 수 있습니다 사실 match. 템플릿을 가져 왔는지 ( <xsl:import>) 여부에 영향을 좋아 합니다. 이것들은 고급 사용이며 당신이 거기에 도착했을 때 있습니다.


@Tomalak의 좋은 답변을 추가 비용 :

비교되지 않은 차이점은 다음과 차이점이 없습니다 .

  1. xsl:apply-templates훨씬 풍부하고보다 더 깊은이며 xsl:call-templates, 심지어에서 xsl:for-each, 일반적인 경우 에이 코드는 노드 목록의 서로 다른 노드에 대해 서로 다른 것 - 우리가 선택의 노드에 적용됩니다 어떤 코드를 모르는 단순히 때문이다 .

  2. 적용될 코드는 xsl:apply templateS 작성한를 원래 작성자를 모르는 사람들 이 작성할 수 있습니다 .

XSLT에 명령 조합 FXSL 라이브러리 의 XSLT에서 고차 함수 (HOF) 구현이 불가능 합니다 <xsl:apply-templates>.

요약 : 템플릿과 <xsl:apply-templates>지침은 XSLT가 다형성을 구현하고 처리하는 방법입니다.

참조 :이 전체 메시지를 참조하십시오 : http://www.biglist.com/lists/lists.mulberrytech.com/xsl-list/archives/200411/0000546.html


xsl:apply-templates일반적으로 적용 가능한 모든 경우를 사용하여 현재 노드의 하위 또는 전체 하위 세트를 처리하는 데 사용하는 것이 좋습니다 . 이는 처리 된 XML의 (심각한) 재귀와 일치하는 XSLT 응용 프로그램의 재귀를 지원합니다.

xsl:call-template반면에 일반 함수 호출과 비용이 발생합니다. 일반적으로 하나 이상의 다음 변수를 사용하여 하나의 명명 된 템플릿을 실행합니다.

따라서 xsl:apply-templates흥미로운 노드의 처리를 가로 채고 (보통) 출력 스트림에 필요한 경우 사용 합니다. 일반적인 (간체 화 된) 예는 다음과 가변합니다.

<xsl:template match="foo">
  <bar>
    <xsl:apply-templates/>
  </bar>
</xsl:template>

와 반면에 xsl:call-template아무것도 당신을위한 전문, 재사용 가능한 기능을 작성합니다 - 나는 일반적으로 텍스트 또는 다른 nodesets로 선택 nodesets 변환과 같이, 함께 일부 하위 노드의 텍스트를 추가하는 등의 문제를 해결한다.

편집하다:

특정 질문 텍스트에 대한 추가 설명 :

<xsl:call-template name="nodes"/> 

이것은 'nodes'라는 템플릿을 호출합니다.

    <xsl:template name="nodes">...</xsl:template>

이것은 다음과 다른 의미입니다.

<xsl:apply-templates select="nodes"/>

... 이름이 'nodes'인 현재 XML 노드의 모든 자식에 모든 템플릿을 적용합니다.


기능은 실제로 유사합니다 ( 속성 및 해당 이름 템플릿이 call-template필요한 호출 의미 체계는 제외 name).

그러나 파서는 같은 방식으로 실행되지 않습니다.

에서 MSDN :

달리 <xsl:apply-templates>, <xsl:call-template>현재 노드 또는 현재 노드 목록을 변경하지 않습니다.

참고 URL : https://stackoverflow.com/questions/4478045/what-are-the-differences-between-call-template-and-apply-templates-in-xsl

반응형