2009-12-23 1 views
0

내가 관련 값의 두 그룹이 포함 된 XML이 :XPath. 타 관련 노드를 기반으로 노드 선택

<Rows> 
    <!-- first group --> 
    <Row> 
     <Sequence>100</Sequence> 
     <Value>+</Value> 
    </Row> 
    <Row> 
     <Sequence>105</Sequence> 
     <Value>+</Value> 
    </Row>  
    <Row> 
     <Sequence>110</Sequence> 
     <Value>-</Value> 
    </Row> 
    <!-- second group --> 
    <Row> 
     <Sequence>150</Sequence> 
     <Value>20</Value> 
    </Row> 
    <Row> 
     <Sequence>155</Sequence> 
     <Value>15</Value> 
    </Row>  
    <Row> 
     <Sequence>160</Sequence> 
     <Value>90</Value> 
    </Row>  
</Rows> 

을 2 그룹의 요소와 관련된 1 그룹의 각 요소 : 순서 -> 순서 + 50

첫 번째 그룹의 관련 노드에 + 기호 (시퀀스 150 및 155가있는 노드)가 포함 된 두 번째 그룹의 노드 집합을 가져와야합니다.

이 노드는 나중에 정렬 및 열거 할 때 필요합니다.

/Rows/Row[contains(/Rows/Row[Sequence = (./Sequence - 50)]/Value, '+')] 

는 I 위의 XPath를 시도했지만 (두번째 대괄호) 현재의 컨텍스트에 참조로서 ./ 실패하지만 (제 대괄호) 부모 하나에 액세스 할 필요가있다.

아무도 해결책을 알고 있습니까?

감사합니다.

P.S. 서브 문자열 (./ 시퀀스 -50, 1, 3)은 사용하기 위해 사용됩니다.

+0

무엇을 선택해야합니까? –

+0

첫 번째 그룹의 관련 노드에 + 기호 (시퀀스 150 및 155가있는 노드)가 포함 된 두 번째 그룹의 노드 집합을 가져와야합니다. – Aikin

답변

1

그냥 거꾸로 쿼리를 설정 :

/Rows/Row[/Rows/Row[contains(Value, '+')]/Sequence = Sequence - 50] 

또한 xsl:key 일을 속도를 여기에 유용 할 수 있음을 주목할 가치가있다.

+0

고마워요! 내일 늦게 내 마음을 바꿨다 :) – Aikin

1

XPath/XSLT에서 컨텍스트 노드 (.)와 현재 노드 (current()) 사이에는 구별이 있습니다. 당신의 예에서

Current node vs. Context node in XSLT/XPath?

현재 노드, 예를 들어, 참조 할 current()를 사용해야합니다 :이 관련 질문을 참조 상기 짧은 XSLT 단편는 질문에 준 조건 출력 문서에 두번째 군으로부터 대응하는 행으로 각 행에 복사한다

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="Row"> 
    <Row1> 
     <xsl:copy-of select="."/> 
    </Row1> 
    <Row2> 
     <xsl:copy-of select="/Rows/Row[./Sequence = (current()/Sequence + 50) and current()/Value = '+']"/> 
    </Row2> 
    </xsl:template> 
</xsl:stylesheet> 

(차이가 50이고, 첫 번째 행은 +의 값을 갖는다).

+0

감사합니다 * divo *, 나는 이미 그 게시물을 보았습니다. 문제는 current() 노드가 루트를 가리키고 있다는 것입니다. 예, 예, 그렇습니다. 필자는 명령형 프로그래머입니다. 전처리 (위의 xsl 스 니펫) : 해결 방법이었습니다. – Aikin

+0

'current()'는 XPath로 작성할 수있는 것에 영향을받지 않으며'xsl : apply-templates'와'xsl : for-each'의 영향을받습니다. 요점은 당신이 항상'xsl : for-each' (아마도 중첩 된)과'xsl : if'를 사용하여 XPath 표현식을 재 작성할 수 있고 필요에 따라'current()'를 사용할 수 있고 변수에 바인드 할 수 있으며, 등등. –