2010-08-16 3 views
3

이 게시물의 제목은 다소 오해의 소지가있을 수 있지만 내가 생각해내는 것이 가장 좋습니다. 텍스트 인코딩에 TEI를 사용하는 프로젝트를 진행하고 있습니다. 내 현재 작업의 요구 사항 중 하나는 XSL 변환을 작성하여 XML로 인코딩 된 텍스트를 HTML로 렌더링하는 것입니다. 대부분 문제는 없습니다. 다른 경우에,중복 요소가있는 XSLT?

<l>There is <delSpan spanTo="A1"/>deleted text spanning</l> 
    <l>multiple lines here.<anchor xml:id="A1"/> More text...</l> 

또는 : 그래도 친절이 문제에의 붙어

<delSpan spanTo="A2"/> 
    <l>Several deleted lines -- the delspan marker can appear </l> 
    <l>outside of an l element.... </l> 
    <anchor xml:id="A2"/> 

(경우에 당신은 TEI에 익숙하지 않은 : L = 텍스트 행; delSpan = 1 줄, 페이지 또는 더 작은 단위가 포함 된 삭제 된 텍스트의 범위)

목표는 delSpan (A1)과 해당 앵커 (A1) 사이의 텍스트를 표시하는 것입니다. - "삭제 된 텍스트 스패닝/multiple lines here "- 삭제를 나타내는 형식이 있습니다 (예 : text-decoration ="line-through "). 현재 대부분의 텍스트 서식을 처리하는 "l"요소에 대한 템플릿이 있습니다. 또는 적어도 다른 템플릿을 호출하여이를 수행합니다.

그러나 이러한 싱글 톤 태그는 예외적입니다. 다른 모든 포맷팅/마크 업은 실제로 포맷 할 텍스트가 포함 된 태그로 수행됩니다. 내가 "l"템플릿에서 delSpan 및 앵커 요소를 처리해야한다고 가정 할 때 맞습니까? 이 문제에 접근하고 의사 중복 요소를 처리하는 가장 우아한 방법은 무엇입니까?

죄송합니다. 멍청한 질문이거나 충분한 정보를 제공하지 않은 경우입니다. 저는 주로 XSLT 경험이 거의없는 C/C++ 프로그래머이므로 어떤 제안이라도 고맙게 생각합니다.

답변

2

이 스타일 :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="delSpan|anchor"/> 
    <xsl:template match="text()[preceding::delSpan[1]/@spanTo=following::anchor[1]/@xml:id]"> 
     <span style="text-decoration:line-through;"> 
      <xsl:value-of select="."/> 
     </span> 
    </xsl:template> 
</xsl:stylesheet> 

출력 :

<doc> 
    <l>There is <span style="text-decoration:line-through;">deleted text spanning</span></l> 
    <l><span style="text-decoration:line-through;">multiple lines here.</span> More text...</l> 
</doc> 

: 앞뒤 축과 문서 순서에서 그 의미를 다음의 사용. l 요소와 일치하는 모든 previus 템플릿을 덮어 쓰지 않습니다. delSpananchor도 스트라이핑되지 않았을 수 있습니다.

+0

+1 좋은 답변입니다. –

+0

감사합니다. 이것은 간단하고 우아하고, 지금 나에게 완벽하게 이해합니다. 나는 XSLT에서 크래쉬 코스를 즐기고있다. –

+0

@ Andrew Forrester : 당신은 잘합니다! 언제든지 물어보십시오. –

1

여기에서 가장 중요한 문제는 delSpan 요소가 부모가 아니며 요소의 끝과 닫음이 빈 요소 (닫는 경우 anchor)라는 것입니다. 개폐 사이의 링크는 xml:id 태그를 참조하여 수행됩니다.

XSLT 1.0 (XSLT 2.0을 사용하면 훨씬 쉽습니다)을 사용한다고 가정하면이 문제에 대한 여러 가지 해결책이 있습니다. 모든 형제 자매를 찾아 적용하지만,이 경우에만 자체는 올바른 xml:id와 형제 anchor 다음 : 아이디어는 간단하다

<xsl:template match="delSpan"> 
    <xsl:variable select="@spanTo" name="spanTo" /> 
    <xsl:apply-templates select="following-sibling::*[following-sibling::anchor[@xml:id = $spanTo]" mode="deleted" /> 
</xsl:template> 

<!-- 
    do this for all elements you need to treat inside delSpan 
    if they have children, remember to use apply-templates with mode deleted 
--> 
<xsl:template match="l" mode="deleted"> 
    <strike><xsl:value-of select="." /></strike> 
</xsl:template> 

아니에요 100 % 확인이 완전히 정확합니다. <delSpan>을 중첩 할 수 있으면 잘못 될 수 있습니다. 운이 좋으면 디미트리 노바 체프 (Dimitri Novatchev)가 걷고보고 있습니다.