기타 -처럼 (XSLT에는 할당 문이 없음을 순전히 기능적인 프로그래밍 언어).
나는 지금까지 제안 된 해결책에 대한 대안이 있습니다. 매개 변수 전달을 피할 수 있습니다 (이는 XSLT에서 장황하고 추악합니다 - 심지어 그것을 인정할 것입니다).
<xsl:template name="section">
<span class="title" id="title-{1 + count(preceding-sibling::section)}">
<xsl:value-of select="title"/>
</span>
</xsl:template>
(참고 : 공백 코드 포맷으로, 당신의 결과에 나타나지 않습니다 공백 전용 텍스트 노드
의 XPath에서
, 당신은 단순히 선행 <section>
요소의 수를 현재의 셀 수
(position()
을 사용하는 것과는 대조적으로)이 접근법의 큰 장점 중 하나는 스타일 시트가 현재 스타일 시트에만 의존한다는 것입니다. 현재 노드 목록에서. 처리를 변경 한 경우 (예 : <xsl:for-each>
도 섹션뿐만 아니라 다른 요소도 처리되므로) position()
의 값은 더 이상 문서의 <section>
요소의 위치와 반드시 일치하지 않습니다. 반면에 위와 같이 count()
을 사용하면 각 <section>
요소의 위치와 항상 일치합니다. 이 방법은 코드의 다른 부분과의 연결을 줄이는 데 일반적으로 매우 좋은 방법입니다.
count() 대신 <xsl:number>
명령어를 사용할 수 있습니다. 여전히를 사용하려는 경우 (추가 변수 선언을 요구하는
<xsl:template name="section">
<xsl:variable name="count">
<xsl:number/>
</xsl:variable>
<span class="title" id="title-{$count}">
<xsl:value-of select="title"/>
</span>
</xsl:template>
그것은 상세에 트레이드 오프가 : 그것은 기본 동작은 당신이 원하는 될 일이 같은 수준에서 모두 같은 이름의 요소 번호를 것입니다 속성 값 템플릿 중괄호), XPath 표현식을 대폭 간소화하므로 약간만 그렇습니다.
개선의 여지가 더 많습니다. 현재 노드 목록에 대한 종속성은 제거했지만 현재 노드에 종속되어 있습니다. 그 자체로는 나쁜 것이 아니지만 현재 노드가 무엇인지 템플릿을 보면 즉시 명확하지 않습니다. 템플릿의 이름이 "section
"입니다. 처리중인 내용을 확실히 알기 위해 코드의 다른 부분을 살펴 봐야합니다. 그러나 그럴 필요는 없습니다.
예를 들어 <xsl:for-each>
과 <xsl:call-template>
을 함께 사용하게 되었다면, 뒤로 물러서서 <xsl:apply-templates>
을 사용하는 방법을 알아보세요.
<xsl:template match="/doc">
<xsl:apply-templates select="section"/>
</xsl:template>
<xsl:template match="section">
<xsl:variable name="count">
<xsl:number/>
</xsl:variable>
<span class="title" id="title-{$count}">
<xsl:value-of select="title"/>
</span>
</xsl:template>
뿐만 아니라 덜 상세이 방법 (<xsl:apply-templates/>
모두 <xsl:for-each>
및 <xsl:call-template/>
대체), 그러나 또한 현재 노드가 무엇 즉시 분명해진다. match
속성을 살펴 보는 것만으로도 <section>
요소를 처리하고 있음을 알고 즉시 <section>
요소를 계산하면됩니다.
match
속성을 갖는 템플릿 규칙 (예 : <xsl:template>
요소)의 작동 원리에 대한 간략한 설명은 "How XSLT Works"을 참조하십시오.
정말 고마워요! 이 게시물 및 답변은 매우 도움이되었습니다 – anpatel
당신을 환영합니다! 다행이라고 생각하면 다행입니다. –
죄송합니다, Evan,하지만 이것은 매우 비효율적 인 솔루션입니다 (O (N^2)). 매개 변수 전달을 사용하는 솔루션은 O (N) 만 가능합니다. "자세한 정보"에 대한이 모든 이야기는 바로이 것입니다 - 자세한 정보 및 효율성에 대한 언급이 없습니다. 제안 된 솔루션의 복잡성에 대해 언급하고 다른 가능한 솔루션과 비교하면이 대답을 독자에게 더욱 유용하게 활용할 수 있습니다. 이러한 이유로 나는이 답변을 조명 튜토리얼 유형으로 간주하고 제작 작업에는 실용적이지 않습니다. –