2016-12-11 2 views
1

docbook 문서를 LaTeX로 처리하는 일부 dblatex XSLT 코드를 수정하려고합니다. 우리는 우리 지방의 필요를 위해 꽤 많은 개조를했다. 그러나 이것은 나를 비틀 거리게했다.속성을 기반으로 한 랩

사실상 모든 docbook XML 요소에 나타날 수있는 '잠재 고객'속성이 있습니다. 문서에서 대부분의 요소는이 attr에 대해 표시가 해제되어 있지만 일부는 'tech'또는 'nontech'로 표시되어 있습니다.

<chapter audience='tech'> 
    (lot of stuff) 
</chapter> 

오히려 "프로파일"기구를 사용하는 대신, I는

\technical{ \chapter (lots of stuff) } 

즉 라텍스 태그와 같은 특성을 갖는 소자를 처리 결과 텍 코드 랩 싶은 내 이 포장 작업을 수행하기위한 XSLT 코드의 시도는 다음과 같습니다

<xsl:template match=".[@audience='tech']"> 
    <xsl:text>\technical{</xsl:text> 
    <xsl:apply-templates/> 
    <xsl:text>}</xsl:text> 
</xsl:template> 

불행하게도,이 결과는이 템플릿과 일치하는 XML 요소가 처리되지 않는다는 것입니다, (xslt 코드에 @select 속성이 없을 때 예상되는 것처럼) 딸만이 수행합니다. 그렇다면 원래는 LaTeX의 출력이 섹션에 대한 LaTeX의 코드가 아닌 장에 대한

<chapter role='tech'> 
    <section>blah blah</section> 
</chapter> 

했다. 나는 위의 XSLT 코드를 변경하는 경우

반하여, 그것은 명시 적

<xsl:apply-templates select="."/> 

그때 내가 무한 재귀를 얻을 수있다 그래서.

개념적으로, LaTeX wrapper \ technical {...}를 출력하여 @audience attr이있는 XML 요소를 처리하도록 xslt에 지시 한 다음 @ audience = '기술'속성.

이 방법이 있습니까? xslt v2를 사용해야하는 경우 xslt v1을 사용하고 있습니다. 어떻게 변경했는지는 확실하지 않지만 방법이 있어야합니다 ...)

답변

0

mode XSLT 1.0부터 사용할 수있는 속성입니다. 모드를 사용하면 동일한 노드와 일치하지만 다른 동작을 수행하는 템플릿을 구별 할 수 있습니다. 따라서 동일한 요소를 여러 번 처리 할 수 ​​있습니다. 자세한 내용은 in the standard을 참조하십시오.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="*" mode="firstRun"/> 
    </xsl:template> 

    <xsl:template match="chapter[@audience='tech']" mode="firstRun"> 
     <xsl:text>\technical{</xsl:text> 
      <xsl:apply-templates select="." mode="secondRun"/> 
     <xsl:text>}</xsl:text> 
    </xsl:template> 

    <xsl:template match="chapter" mode="secondRun"> 
     <xsl:text>\chapter{</xsl:text> 
      <xsl:value-of select="."/> 
     <xsl:text>}</xsl:text> 
    </xsl:template> 

</xsl:stylesheet> 
+0

스키마에서 @audience attr을 허용하는 모든 요소에 모드를 지정해야합니까? 나는 분명히하고 싶지 않을 것이다. (docbook에는 100 가지 요소가 있고, dblatex 코드는 이미 충분히 복잡하다.) 내가 그것을 시도해야하고 위의 "secondRun"을 생략 할 수 있는지 확인해야합니다. –

+0

'secondRun' 모드를 생략 할 수 있습니다. 메커니즘을 설명하기 위해 포함 시켰습니다. 일반적으로,'xsl : apply-templates' 엘리먼트가 모드를 지정하면, 그 모드의 템플리트 만 적용됩니다. 그렇지 않으면 모든 모드 (예 : 기본 동작)에 속하지 않는 템플릿이 적용됩니다. 반대로, 모드를 지정하는 템플릿은 같은 모드의'xsl : apply-templates'에 의해서만 매치 될 수 있습니다. – Meyer

+0

@Mike Maxwell,이 답변으로 충분 했습니까? 아니면 도움이 더 필요합니까? – Meyer

관련 문제