문제

다음은 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])&gt;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) &gt; 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])&gt;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])&gt;0">descendant-selected </xsl:if>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top