2010-04-21 3 views
0

다음 XPath 질문에 도움을 줄 수있는 사람이 있습니까? 주어진 노드 집합 :요소의 속성 및 내용과 일치하는 XPath

<table> 
    <rows> 
    <row> 
     <value column="Product">Coal</value> 
     <value column="Quantity">10000</value> 
    </row> 
    <row> 
     <value column="Product">Iron</value> 
     <value column="Quantity">5000</value> 
    </row> 
    <row> 
     <value column="Product">Ore</value> 
     <value column="Quantity">4000</value> 
    </row> 
    </rows> 
</table>

특정 제품 이름의 노드 하위 집합을 찾으려면 쿼리 할 수 ​​있습니다. 제품 이름은 처리중인 현재 노드의 속성 (예 : "@name")에 의해 제공됩니다. 그래서 @name 속성이 "석탄"의 값을 가질 때 나는이 반환 기대하는 것은 :

<row> 
    <value column="Product">Coal</value> 
    <value column="Quantity">10000</value> 
</row>

이것은 내가 가지고 올 한 것입니다; 나는 그것이 틀렸다는 것을 알고 있습니다. 왜냐하면 나는 아무것도 얻지 못하기 때문입니다./코드 >

+0

XML의 줄을 강조 표시 한 다음 편집기 도구 모음에서 "코드"단추 (101 010)를 누르면 실제 앵글과 함께 XML을 게시 할 수 있습니다. 수동으로 모든 꺾쇠 괄호를 < 및 > .....으로 대체 할 필요가 없습니다. ..... –

+0

오, 팁 주셔서 감사합니다. 더 쉬운 방법이 있어야한다는 것을 알고있었습니다 :-) – gerrod

답변

2

당신은 분명히 컨텍스트 노드가 술어가 적용되는 노드 (대괄호 안에 IE)하는 XPath 술어 내에서 current() 기능

 
$table/rows/row[value[@column='Product'] = current()/@name] 

누락

$table/rows/row[value[@column='Product'][text()[email protected]]]

< .

귀하의 경우, $table/rows/row[[email protected]]라고 말하면 @namerow@name 속성을 나타냅니다. 어떤 @name 속성이 없으므로 술어는 항상 모든 노드에 대해 false으로 평가됩니다.

current()은 정확하게이 경우에 도움이되도록 현재 XSLT 컨텍스트 노드를 반환합니다.

+0

완벽한 Tomalak에게 감사드립니다. @name 애트리뷰트를 먼저 변수에 복사하는 방법으로 해결 방법을 생각해 냈지만, 훨씬 더 좋네요. – gerrod

+0

나는 현재()가 필요하다고 생각하지 않는다. 아마도 내가 틀렸을 수도 있지만, ''와 똑같은 현재()가 아니다. –

+2

@vtd : 네, 틀렸어. 'current()'가'.'와 같으면'current()'가 존재하지 않습니다. ;) – Tomalak

관련 문제