2013-06-18 4 views
1

I이 일반 XML로 intertwingled -markup는 "이정표"

<root> 
    <milestone type="opener" xml:id="m1" /> 
    text 
     <milestone type="opener" xml:id="m2"/> 
      text 
     <milestone type="closer" ref="#m2"/> 
     text 
     <node> 
     text 
     </node> 
     ... 
    <milestone type="closer" ref="#m1"/> 
</root> 

하고 "부모"-milestone 구조를 해결하려면 (즉 [email protected]:id='m1'를)에서 <node>으로 XPath를 사용합니다.

모든 [email protected]:id은 오프너로서 그리고 이정표 구조의 가까이에 [email protected]에 해당합니다.

노드에 "부모"-milestone 구조는

node/preceding::milestone/concat('#',@xml:id) = node/following:milestone/@ref 

이 테스트는 <node>의 맥락에 의존 비슷한 무언가에 의해 식별 될 것이다.

<xsl:template match="node"> 
    <xsl:variable name="me" select="."/> 
    <xsl:value-of select="./preceding::milestone[ 
     ./concat('#',@xml:id) = 
     $me/following::milestone/@ref 
    ][1]/@xml:id" /> 
</xsl:template> 

과 같이 XSLT로 구현 될 수 있지만 순수한 XPath를 사용하여이를 수행하는 방법을 알 수는 없습니다.

제안 사항?

+0

위의 예제 작업을 수행하는 방법으로 concat ('#', @ xml : id)'앞에'. /'를 제거해야합니다. –

+0

나는 당신이하고 싶은 것을 확실히 모르겠습니다. 입력에 대한 예제로 문항을 확장 할 수 있습니까 (컨텍스트는 ''요소입니까?) 예상 출력은 무엇입니까? –

+0

필자는 입력에서 XPath 만 읽을 수있는 응용 프로그램에 대한 가져 오기 필터를 준비했습니다 (이후에는 불행히도 알지 못합니다). 애플리케이션은 ''(즉, 생성 된 ID)과 마일스톤으로 생성 된 구조 사이에 '링크'를 만들어야합니다. 주어진 예에서 'milestone [@xml : id ='m1 ']'은 올바른 출력이 될 것이고,'milestone [@xml : id = 'm2']'는 부정확하다. – user2496459

답변

0

변수 $mecurrent()으로 바꿉니다.

+0

'current()'가 XSLT 전용 인 경우 사용자가 순수한 XPath 솔루션을 요청했습니다. –