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의 좋은 답변을 추가 비용 :
비교되지 않은 차이점은 다음과 차이점이 없습니다 .
xsl:apply-templates
훨씬 풍부하고보다 더 깊은이며xsl:call-templates
, 심지어에서xsl:for-each
, 일반적인 경우 에이 코드는 노드 목록의 서로 다른 노드에 대해 서로 다른 것 - 우리가 선택의 노드에 적용됩니다 어떤 코드를 모르는 단순히 때문이다 .적용될 코드는
xsl:apply template
S 작성한를 후 원래 작성자를 모르는 사람들 이 작성할 수 있습니다 .
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>
현재 노드 또는 현재 노드 목록을 변경하지 않습니다.
'IT' 카테고리의 다른 글
카트리지 쓰기 또는 무시 (0) | 2020.07.24 |
---|---|
crontab 작업을 생성, 편집 및 삭제하기 위해 PHP를 사용합니까? (0) | 2020.07.24 |
Google Espresso 또는 Robotium (0) | 2020.07.24 |
Rust 프로그램이화물에서 메타 데이터에 어떻게 접근 할 수 있습니까? (0) | 2020.07.24 |
정수 (0)를 잡는 방법? (0) | 2020.07.24 |