xslt & xpath syntax> '외부'범위에서 요소를 참조하는 방법
문제
다음은 100% 올바르게 작동합니다. 그러나 나의 호기심을 충족시키기 위해 ... currentID 변수를 선언하지 않고도 동일하게 달성 할 수있는 방법이 있습니까? XPath "테스트"조건 내에서 참조 할 수있는 방법이 있습니까?
조건의 XPath 쿼리는 2 개의 @ID 속성을 참조하여 일치하는지 확인해야합니다.
- 'current'@id
- 각 '조상'@id
코드는 다음과 같습니다.
<xsl:variable name="currentID" select="@id" />
<xsl:attribute name="class">
<xsl:if test="count($currentPage/ancestor::node [@id = $currentID])>0">descendant-selected </xsl:if>
</xsl:attribute>
해결책
당신이 선택하기 때문에 $currentID
컨텍스트 노드에서 :
<xsl:variable name="currentID" select="@id" />
당신은 사용할 수 있습니다 current()
항상 XSLT 컨텍스트 노드를 나타내는 함수 :
<xsl:attribute name="class">
<xsl:if test="count($currentPage/ancestor::node[@id = current()/@id) > 0]">
<xsl:text>descendant-selected </xsl:text>
</xsl:if>
</xsl:attribute>
이렇게하면 변수가 필요하지 않습니다.
몇 가지 다른 메모 :
- 사용하는 것이 좋습니다
<xsl:text>
위에 표시된 것처럼. 이를 통해 코드를 형식화하고 지나치게 긴 줄을 피할 수 있습니다. - 당신은 할 필요가 없습니다
count() > 0
, 단순히 노드를 선택하면 충분합니다. 존재하지 않으면 빈 노드 세트가 반환됩니다. 비어있는 노드 세트는 항상 참으로 평가되는 반면 항상 거짓으로 평가됩니다.
노드를 참조하는 경우 @id
XSL 스타일 시트에서 정기적으로 <xsl:key>
유익 할 것입니다 :
<xsl:key name="kNodeById" match="node" use="@id" />
<!-- ... -->
<xsl:attribute name="class">
<xsl:if test="key('kNodeById', @id)">
<xsl:text>descendant-selected </xsl:text>
</xsl:if>
</xsl:attribute>
위는 필요하지 않습니다 current()
XPath 술어 외부에서는 컨텍스트가 변경되지 않습니다. 또한, 나는 그렇지 않습니다 count()
노드는 중복되기 때문에 (설명 된대로).
다른 팁
템플릿에서 처리 된 현재 노드를 참조하려면 current ()를 사용하십시오.
<xsl:if test="count($currentPage/ancestor::node [@id = current()/@id])>0">
팀은 나를 생각하게했다 .... 나는 내가 물건을 복잡하게 생각하고 있다고 생각하고, 나는 다음을 시도했다.
<xsl:if test="@id = $currentPage/ancestor::node/@id">descendant-selected </xsl:if>
XSLT는 속성을 선택한 속성과 비교하고 일치하는 경우 True를 평가하는 것이 행복해 보입니다. 누군가가 왜 작동하는지에 대한 더 나은 설명이 있거나 더 나은 (더 간결한) 설명을한다면 그것을 내려 놓으십시오.
이미 명확 해짐에 따라 "외부 범위"를 언급하는 것은 "="연산자를 사용하여 직접 비교할 수 있기 때문에 문제가되지 않았습니다. 그러나 현재 ()가 필요한 경우가 있으며 Current ()조차 절단하지 않는 것 외에도 (두 개 이상의 컨텍스트 사이에 "조인"해야하기 때문에). 이 경우 XPath 2.0의 "for"표현식은 필수 불가결합니다.
당신은 단순히 할 수 있습니다 :
<xsl:if test="count($currentPage[ancestor::node/@id = @id])>0">descendant-selected </xsl:if>