2016-08-11 5 views
0

<tref> 요소를 내 문서의 다른 태그로 바꿔야합니다. 예를 들어, 내가 가진 :이 스타일 시트와XSLT의 요소를 재귀 적으로 바꾸기

<p id="4"> 
    <cs id="56792">1090-189-01 </cs> 
    <href id="57237"> 
     <cs id="56792">Document Name</cs> 
    </href> 
</p> 

:

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="tref"> 
    <xsl:variable name="NodeID"><xsl:value-of select="@id"/></xsl:variable> 
    <xsl:copy-of select="//Topic[ID = $NodeID]/Text/p/node()"/> 
</xsl:template> 

다음이 문제가되지 않습니다 얻기

<tref id="57236"/> 

<Topic> 
    <ID>57236</ID> 
    <Text> 
     <p id="4"> 
      <cs id="56792">1090-189-01 </cs> 
      <href id="57237"> 
        <cs id="56792">Document Name</cs> 
      </href> 
     </p> 
    </Text> 
</Topic> 

내가 할 수없는 것은 다른 trefs에 중첩 된 trefs를 대체하는 것입니다. 예를 들어, 다음 사항을 고려

<tref id="57236"/> 

과 :

<Topic> 
    <ID>57236</ID> 
    <Text> 
     <p id="251"> 
      <tref id="37287"/> 
     </p> 
    </Text> 
</Topic> 
내 스타일이 정식 태그의 내용으로 TREF을 대체

- 또한 TREF 포함

<p id="251"> 
    <tref id="37287"/> 
</p> 

내 현재 해결책은 두 개의 서로 다른 스타일 시트에서 <xsl:template match="tref">으로 호출하는 것입니다. 그것은 일을하지만 아주 우아하지는 않습니다. trefs가 더 깊게 중첩되어 있다면 어떻게 될까요? 그리고 재귀는 XSLT의 빵과 버터입니다.

XSLT처럼 모든 trefs를 재귀 적으로 바꾸는 해결책이 있습니까?

답변

2

대신 xsl:copy-of를 사용하는

<xsl:apply-templates select="//Topic[ID = current()/@id]/Text/p/node()"/> 

참고가 xsl:key의 사용은 룩업하는 Topic 요소를 만들 수 varianle의 사용을 제거하기 위해, xsl:apply-templates

<xsl:apply-templates select="//Topic[ID = $NodeID]/Text/p/node()"/> 

를 사용하거나

<xsl:key name="topic" match="Topic" use="ID" /> 

그러면 다음과 같이 쓸 수 있습니다. 당신이 그것의 조상 인 Topic 참조하는 tref있는 경우이

<xsl:apply-templates select="key('topic', @id)/Text/p/node()"/> 

는 무한 재귀주의하십시오.

+0

Tim, 답변 해 주셔서 대단히 감사합니다. 스 니펫 # 1과 # 2를 적용했으며 제대로 작동합니다. 나는 xsl : key에 익숙하지 않기 때문에 # 3과 # 4에 대해 숙고해야 할 것입니다. –

+0

스 니펫 4에 약간의 오류가 있었는데, 지금 수정했습니다. 특히 XSLT 1.0에서 그룹화 할 필요가있는 경우 매우 유용한 명령이므로 xsl : key에 대해 학습하는 것이 좋습니다. –

관련 문제