2012-04-26 8 views
1

현재 대부분 HTML을 나타내는 간단한 마크 업이 있습니다. 다음은 자식 노드 표시

그러나 나는 문제가, 내가 물론 <b> 태그를 통해 전달되고 자동으로 굵은 글씨로 표시되어 있는지 확인 <xsl:copy-of>를 사용할 수

<li>Make this <b>Bold</b></li> 

의 조각입니다.

키워드 나 구문의 저장소에 대해 태그를 검사하는 다른 XSL을 사용하고 있으며 링크가 만들어지면이를 작성합니다.

다음은 그러나 나는이 문제를 얻을 수있는 방법에 대한 확실하지 오전,이 방법을 통해 전달되는 하위 태그를 방지

<xsl:template name="List" match="li"> 
    <li> 
      <xsl:call-template name="markup"> 
      <xsl:with-param name="text" select="."/> 
      <xsl:with-param name="phrases" select="document('../../documents/main/keywords.xml')/keywords/keyword"/> 
      <xsl:with-param name="first-only" select="false()"/> 
      </xsl:call-template> 
    </li> 
    </xsl:template> 

내 XSL입니다.

도움을 주시면 대단히 감사하겠습니다. Dan

+0

_markup_의 템플릿에 대한 추가 정보를 제공해 주시겠습니까? 현재 _li_ 요소의 하위 요소가 손실되는 이유는 알 수 없습니다. _li_ 요소 전체를 템플릿에 전달하기 때문에 ('') 모든 템플릿은 템플리트 내에서 계속 사용할 수 있어야합니다. – Martin

+0

http://www.jenitennison.com에서 제공하는 markup.xsl을 사용하고 있습니다. 본질적으로 markup.xsl은 키워드 리포지토리 (keywords.xml)를 조사하여보고있는 문서와 비교합니다. 일치하는 경우 다음 코드를 사용합니다. \t \t \t

+0

http://www.jenitennison.com/xslt/utilities/markup.xml –

답변

1

문제는 링크 작성 템플릿이 잘못된 것입니다.

옳은 일은 ID 템플릿을 사용하고 <li> 요소의 텍스트 노드 자손 전용 템플릿을 만드는 것입니다.

이 시도 :

<xsl:variable 
    name="keywords" 
    select="document('../../documents/main/keywords.xml')/keywords/keyword" 
/> 

<!-- the identity template does copies of everything not matched otherwise --> 
<xsl:template match="node() | @*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node() | @*" /> 
    </xsl:copy> 
</xsl:template> 

<!-- text nodes in <li> elements get special treatment --> 
<xsl:template match="li//text()"> 
    <xsl:call-template name="markup"> 
    <xsl:with-param name="phrases" select="$keywords"/> 
    <xsl:with-param name="first-only" select="false()"/> 
    </xsl:call-template> 
</xsl:template> 

<!-- marks up the current node --> 
<xsl:template name="markup"> 
    <xsl:with-param name="phrases" /> 
    <xsl:with-param name="first-only" select="true()" /> 

    <!-- you can use . here - no need to pass in a $text param --> 
</xsl:template> 

정체성 템플릿이 성공적으로 이와 같은 문제를 해결하는 열쇠입니다. <li><b>을 투명하게 복사합니다.

  1. 더 구체적인 템플릿이 현재 노드와 일치하지 않는 한 입력을 완전히 가로 채고 복사합니다.
  2. 즉, 으로 변경하려는 노드의 템플릿 만 작성하면됩니다.입니다. 이 경우 일치하는 텍스트 노드은 중첩 된 하위를 가질 수 없기 때문에 가장 잘 작동합니다.
  3. <xsl:template name="List">과 같은 명명 된 템플릿을 사용하지 마십시오. 이는 '푸시 스타일'XSLT입니다. 즉 필수적이며 종종 서투른 결과를 초래합니다.
  4. <xsl:template match="li//text()">은 스트림에서 노드을 가져오고 복사하는 것보다 더 복잡한 작업을 수행합니다. 이것은 "풀 스타일"XSLT, 즉 템플릿 매칭입니다. 대개 처리가 쉽고 더 깨끗한 XSLT 코드를 생성합니다.
  5. 물론 문자 노드 <li> 내의 텍스트 노드에 제약을받지 않습니다. 일치 표현식을 변경하여 다른 노드에 영향을줍니다.

다른 모든 템플릿을 방해하지 않고 <b> 노드를 <strong>으로 바꾸고 싶다고합시다. 풀 스타일이이만큼 쉽게 :

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

또한 당신이 <xsl:call-template>을 할 때 현재 노드가 변경되지 않습니다. 따라서 호출 된 템플릿에 현재 노드를 전달할 필요가 없습니다.

+0

당신을 스타 야! 참으로 대단히 감사합니다. –

+0

@Daniel 대단합니다. – Tomalak