2014-12-05 3 views
2

검색했으나 검색 할 항목을 모르기 때문에 명백한 내용을 놓친 것일 수 있습니다. 그리고 간단한 질문으로 설명하기가 어렵다는 것을 알았습니다. 다음 코드 (XSLT 1.0 & XPath)를 사용하여이 노드의 부모가 마지막 그랜드 부모 노드에 속하는지 여부를 확인합니다.XPath 및 XSLT를 사용하여 상위 노드를 확인하십시오.

<xsl:when test="count(parent::*/preceding-sibling::*)+1 = count(parent::*/parent::*/*)"> 

정확히 내가 원하는 것처럼 작동합니다. 내가 원하는 것은 한 가지 방법이나 다른 방식으로 더 일반적으로 만들어 부모 노드를 더 많이 사용하도록 만드는 것입니다. 추가 할 수있는 방법이 있나요

<xsl:when test ="count(parent::*/parent::*/preceding-sibling::*)+1 = count(parent::*/parent::*/*)"> 

"부모 :: * /"대신에 특정 템플릿 경기를 많이 만드는 재귀 템플릿 루프 : 나는 다른 템플릿 매칭을 추가하고 다른 테스트를 추가 할 수 있습니까? 아니면 더 나은 XPath 코드를 모두 사용해야합니까?

참고 : 상위 노드의 모든 수준에 대해 확인하고 싶습니다. 부모 부모의 마지막, 그랜드 - 부모의 마지막 그랜드 부모 등

명확성을 위하여이다,이처럼 사용

<xsl:choose> 
    <xsl:when test="count(parent::*/preceding-sibling::*)+1 = count(parent::*/parent::*/*)"> 
    <!-- show image A --> 
    </xsl:when> 
    <xsl:otherwise> 
    <!-- show image B --> 
    </xsl:otherwise> 
</xsl:choose> 
+0

를 사용하여 조상 :: 축 대신 부모 : :? – Mike

+0

@ 마이크 내가 그것을 볼 것입니다, 언뜻 보면 그것이 내가 원하는 것처럼 보입니다. – timlarsson

+0

흠, 아니요, 모든 개별 조상이 마지막이든 아니든 모두를 아는 것을 알고 싶기 때문에 제가 실제로했던 것이 아닙니다. – timlarsson

답변

2
<xsl:when test="count(parent::*/preceding-sibling::*)+1 = count(parent::*/parent::*/*)"> 

이 될 수 단순화로 : 일반 영어

<xsl:when test="not(../following-sibling::*)"> 

을 "내 부모 형제 후속 요소를 가지고 있지 않습니다." 쉽게 수정 될


: 일반 영어 에서

<xsl:when test="not(../../following-sibling::*)"> 

를 "내 부모의 부모는 다음과 같은 요소 형제가 없습니다." 등


동시에 모든 조상을 확인하려면 : 일반 영어 에서

<xsl:when test="not(ancestor::*/following-sibling::*)"> 

을 "내 조상의 아무도는 형제 후속 요소가".


동시에 부모와 조부모를 확인하려면 일반 영어 에서

<xsl:when test="not(ancestor::*[position() &lt;= 2]/following-sibling::*)"> 

을 "내 두 가장 가까운 조상의 아무도는 형제 후속 요소가".


편집 개별적으로 모든 조상을 확인하거나 재귀 템플릿을 사용하려면

<xsl:template match="*" mode="line-img"> 
    <xsl:if test="following-sibling::*"> 
    <!-- show image A --> 
    </xsl:if> 
    <xsl:if test="not(following-sibling::*)"> 
    <!-- show image B --> 
    </xsl:if> 
    <xsl:apply-templates select=".." mode="line-img" /> 
</xsl:template> 

<!-- and later... --> 

<xsl:apply-templates select=".." mode="line-img" /> 
: (장점 : 효과적으로 올라가거나 조상의 목록을 아래로하면 내부 <xsl:apply-templates>의 위치가 결정)

...또는 간단한를위한 각 루프 (항상 문서 순서에서 작동) :

<xsl:for-each select="ancestor::*"> 
    <xsl:if test="following-sibling::*"> 
    <!-- show image A --> 
    </xsl:if> 
    <xsl:if test="not(following-sibling::*)"> 
    <!-- show image B --> 
    </xsl:if> 
</xsl:for-each> 

... 또는, (항상 문서 순서에서 작동) 완전히 관용적 될 :

<xsl:template match="*" mode="line-img"> 
    <xsl:if test="following-sibling::*"> 
    <!-- show image A --> 
    </xsl:if> 
    <xsl:if test="not(following-sibling::*)"> 
    <!-- show image B --> 
    </xsl:if> 
</xsl:template> 

<!-- and later... --> 

<xsl:apply-templates select="ancestor::*" mode="line-img" /> 
+0

첫 부분은 많은 의미를 가지며 실제로 유용합니다! 나는 첫 번째 게시물에서 약간 불분명했다. 왜냐하면 나는 각각의 조상에 대해 개별 점검이 필요하기 때문이다. – timlarsson

+0

다른 변종 중 하나가 당신이 원하는대로 할 것 같습니까? – Tomalak

+0

사실, 당신을 올바르게 이해한다면. 그러나 부모 노드를 매개 변수로 보내는 재귀 템플릿과 함께 "not (../ following-sibling :: *)"단순화를 사용하면 모든 조상에 대해 테스트 결과가 필요하므로 아마 원하는대로 할 수 있습니다. 예 : "예, 아니요, 아니요, 예, 아니오" – timlarsson

관련 문제