2014-10-14 3 views
4

저는 XSLT에서 mode 속성을 사용하는 법을 배웠고 xsl : if 문과 같이 템플릿 내에서 테스트 할 수있는 방법이 있는지 궁금합니다. 나는 그것이 xsl : template 레벨에서 사용되는 것을 보았을 뿐이며, 아마도 그것이 유일한 방법 일 것입니다. 나는 "../"경로 속성 (@href) 앞에 추가 할 수 있지만, 말 경우에만 모드 = "인쇄"제가 적용 템플릿을 함께하고, 모드없이 전화 드렸습니다xsl : if 테스트에서 모드를 사용할 수 있습니까?

 <xsl:template name="object" mode="#all"> 
     <img> 
     <xsl:attribute name="src"> 
      <xsl:if test="mode='print'"><xsl:text>../</xsl:text></xsl:if> 
      <xsl:value-of select="@href"/> 
     </xsl:attribute> 
     </img> 
    </xsl:template> 

= "print"는 다양한 다른 템플릿에서 설정됩니다.

물론 mode = "print"로 새 템플릿을 만들 수 있지만 두 개의 템플릿을 유지해야합니다.

아니면 더 좋은 방법이 있을까요? 도와 주셔서 감사합니다. - 스콧

+0

어떤 프로세서

<xsl:template match="/"> <xsl:apply-templates select="something" mode="a"> <xsl:with-param name="mode" select="'a'" tunnel="yes"/> </xsl:apply-templates> <xsl:apply-templates select="something" mode="b"> <xsl:with-param name="mode" select="'b'" tunnel="yes"/> </xsl:apply-templates> </xsl:template> 

다음을 BE- 수있는 한 가지 방법은 당신이 작업하는? Saxon 인 경우 [saxon : current-mode-name()]이라고하는 Saxon 확장이 있습니다 (http://www.saxonica.com/documentation9.4-demo/html/extensions/functions/). currentmode.html). 불행히도, 그것은 Saxon에서 사용할 수 없습니다. –

+0

두 개의 템플릿이있는 것이 정확히 무엇입니까? 기능을 복제하지 않고 작성하지만 하나는 일반이고 다른 하나는 경로 접두사가있는 매개 변수로 첫 번째를 호출하는 것이므로 나쁘지는 않습니다. –

+0

내 템플릿이 복잡 할 수 있으며 하나의 변형 만 있으면 두 템플릿을 유지 관리하는 것이 비효율적 인 것처럼 보입니다. 예를 들어 select = "@ href"를 = "@ id"로 변경하기로 결정한 경우 두 곳에서해야합니다. 이것은 간단한 예입니다. 그러나보다 복잡한 구조로 인해 지저분해질 수 있습니다. –

답변

3

아직 그것을 할 수있는 직접적인 방법이 없습니다. 에 일치하는

<xsl:template match="blah" mode="a b"> 
    <xsl:param name="mode" tunnel="yes"/> 

    <xsl:if test="$mode='a'"> 
    <!-- Do Something --> 
    </xsl:if> 

    <xsl:if test="$mode='b'"> 
    <!-- Do Something --> 
    </xsl:if> 

</xsl:template> 
+1

매우 잘 작동합니다, 감사합니다! –

+0

환영합니다! – Vinit

0

현재 모드를 얻을 수있는 방법은 없습니다,하지만 당신은이 작업을 수행 할 수 있습니다

<xsl:template match="object" mode="#all"> 
    <xsl:param name="print" select="false()"/> 

    <!-- Your code here --> 
</xsl:template> 

<xsl:template match="object" mode="print"> 
    <xsl:next-match> 
    <xsl:with-param name="print" select="true()"/> 
    </xsl:next-match> 
</xsl:template> 
+0

감사합니다,하지만 난 내 XSL을 얻을 것이라고하는 방법을 잘 모르겠어요 : ... 거기 경우 ... 무언가 ... ... 다른 것을하십시오 ... –

+0

@ScottStark 그게'print' 매개 변수를위한 것입니다. –

관련 문제