2011-03-08 4 views
0

지금 당장은 특정 요소 "루트"를 바로 잡을 수 있으며 이러한 요소에는 대시가 포함 된 이름이 있습니다. 예를 들어,이 직계 자녀들이 'A4-1', 'B3-2'및 'C4-3'이름을 가지고 있다고 가정 해보십시오.XSLT 2.0 - 비교 테스트 경로를 변경하는 방법

나는 다음과 같은 사이비 코드의 라인을 따라 뭔가 할 수 있도록하고 싶습니다

:

for each immediate child 
    print out it's child element figtitle/autonum/@ID 

이 문자열로 길을 연결하지 않고 이런 일을 할 수있는 방법이 있나요를? 속성 값은 예를 들어, 다른 값으로 나는 그것의 경로의 나머지 부분에 직접적인 자 값을 CONCAT 때마다, 나는 문자열을 얻을, 그래서 그것을 비교할 수 없습니다입니다 :

<xsl:if test="*['yes' = (PATH)]"> 
    <xsl:value-of select="PATH[@ID = 'yes']"/> 
</xsl:if> 

경로가 될 것이다 여기서

루트/A4-1/figtitle/AUTONUM/ID @
루트/B3-2/figtitle/AUTONUM/ID @
루트/C4-3/figtitle/AUTONUM/ID

+0

나는 그 질문을 이해하지 못한다. Pleas는 입력 샘플과 원하는 출력을 제공합니다. –

+0

당신은 모두를 혼란스럽게 만들었습니다. '$ element = { 'A4-1', 'A4-2', 'A4-3'} 은 XSLT 또는 XPath에 대해 유효한 구문이 아닙니다. 질문을 수정하고 다시 공식화하십시오. –

+0

Alejandro & Dimitrie - 질문을 수정했습니다 ... 잘하면 지금 이해하기가 쉽습니다. – Katie

답변

1

발현 @ 너는이 필요하다 :

/root/*/figtitle/autonum/@ID 

의미

이 최상위 요소 root의 손자 인 figtitle 요소의 자식 어떤 autonum 요소의 모든 ID 속성을 선택합니다.

요소 root 문서의 최상위 요소가 아닌 경우, 표현은 문맥 노드로 root의 부모로 평가 될 것이다 다음 경우 표현해야한다 :

root/*/figtitle/autonum/@ID 

설명 :

식 :

someElement/* 

모든 elemen 선택 ts는 표현식이 평가되는 컨텍스트 노드 (현재 노드)의 하위 노드 인 someElement의 하위 노드입니다.

따라서 someElement의 자식 이름을 명시 적으로 열거 할 필요는 없습니다.

업데이트 : OP는 root의 자식 만 선택해야한다는 의견에 명확하게 나타났습니다. 이름에는 대시, 숫자 및 문자가 포함되어 있습니다.

이 XPath 식 :

루트/* [포함 (이름(), '-') 및 번역 (이름을(), $ vAlphaNum, '') = ''] /figtitle/autonum/@ ID

은 이러한 모든 요소를 ​​정확하게 선택합니다.

여기에서 변수 $vAlphaNum은 모든 대소 문자와 숫자 0-9를 포함하도록 정의해야합니다.

XSLT 2.0에서는 matches() 함수를 적절한 정규 표현식과 함께 사용할 수 있습니다.

+0

@Dimitrie. 루트의 모든 하위 항목을 선택하지 않으려 고합니다. 대시, 문자 및 숫자가 포함 된 항목을 모두 선택하려고합니다. 그렇게 할 수있는 방법이 있습니까? – Katie

+0

@Katie, 물론 있습니다. 질문을 업데이트 할 수 있습니까? –

+0

@Katie : 그에 따라 답변을 업데이트했습니다. :) –

관련 문제