2012-01-13 2 views
1

템플릿을 "확장하는"템플릿을 작성하고 있지만 몇 가지 문제가 있습니다. 이와모든 매개 변수를 전달하는 모든 XSL 템플릿을 catch하는 방법은 무엇입니까?

<xsl:template match="*[@condition]" mode="#all"> 
<xsl:element name="condition"> 
    <xsl:attribute name="name"> 
    <xsl:value-of select="@condition"></xsl:value-of> 
    </xsl:attribute> 
    <xsl:apply-imports> 
    </xsl:apply-imports> 
</xsl:element> 

문제는 <xsl:apply-imports> 누락 PARAMS를 사용하여 호출 템플릿입니다. 이 템플릿이 확장하려고하는 여러 템플릿이 있으므로 매개 변수 목록을 알 수 없습니다 (따라서 mode="#all").

좋은 방법이 있습니까?


추가 예 :

두 개의 최종 템플릿 (읽기 전용)을 고려 :

<xsl:template match="*" mode="mode1"> 
    <param name="p1"/> 
</xsl:template> 

<xsl:template match="*" mode="mode2"> 
    <param name="p2"/> 
</xsl:template> 

그들이 어디라고는 (읽기 전용) :

<xsl:apply-templates mode="mode1"> 
    <xsl:with-param name="mode1" select="$mode1"/> 
</xsl:apply-templates> 

<xsl:apply-templates mode="mode2"> 
    <xsl:with-param name="mode2" select="$mode2"/> 
</xsl:apply-templates> 

이가 수도 mode1, mode2, mode3, mode4 ... 100이 될 수 있으며 이름에는 패턴이 없습니다.

마지막 템플릿 주위에 추가 정보를 포함하는 전체 템플릿이 필요합니다. 예 :

<xsl:template match="*" mode="#all"> 
    <xsl:next-match/> 
</xsl:element> 

위의 전역 템플릿은 매개 변수를 템플릿에 전달하지 않습니다.

답변

1

<xsl:apply-imports>을 호출 할 때 현재 템플릿에 전달 된 매개 변수가 포함되어 있지 않으면 터널 매개 변수를 사용할 수 있습니다. 템플릿에서이 같이 표시하여 매개 변수를 확장됩니다

<xsl:with-param name="foo" tunnel="yes"/> 

나는 또한 <xsl:next-match> 대신 <xsl:apply-imports>의를 사용하는 것이 좋습니다 :

또한
<xsl:param name="foo" tunnel="yes"/> 

, 당신은 매개 변수를 전달할 때.

+0

감사합니다. 이것은 부분적으로 문제입니다. param의 이름도 알 수 없지만 이름 = "foo"는 알려지지 않았으며 다양한 매개 변수를 사용하는 다양한 템플릿이 있습니다. 모든 템플릿을 찾고 거기에있는 모든 매개 변수를 나열하는 것은 불가능합니다. – Jason

+0

@ Jason : 템플릿을 사용할 때마다 모든 템플릿에 터널 매개 변수를 선언 할 필요가 없습니다. –

+0

또 다른 완전한 예를 추가했습니다. 이것이 내가 원하는 것을 보여주기를 바랍니다. 열쇠는 템플리트가 읽기 전용이고 호출자 파일도 읽기 전용이라는 것입니다. 어떻게 든 템플릿을 확장 할 수 있습니다. – Jason

1

Max Toro에서 제안한대로 터널 매개 변수를 사용하거나 하나의 매개 변수을 전달할 수 있습니다.이 템플릿의 자식은 다른 템플릿에서 필요로하며 인식 할 수있는 매개 변수입니다.이 같은

뭔가 : 대답에 대한

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:param name="pComposite" as="element()*"> 
    <param for="templateX" name="pA"> 
    12 
    </param> 
    <param for="templateY" name="pB"> 
    Some String 
    </param> 
</xsl:param> 

<xsl:template match="*[@condition]"> 
    <condition name="{@condition}"> 
    <xsl:apply-imports> 
    <xsl:with-param name="pComposite" 
     select="$pComposite"/> 
    </xsl:apply-imports> 
    </condition> 
</xsl:template> 
</xsl:stylesheet> 
+0

Dimitre에게 감사드립니다. 도움이됩니다. 많은 매개 변수가있는 많은 템플릿이있는 경우 pComposite 매개 변수에서 모든 템플릿을 반복해야합니까? params가 다른 템플릿에 더 투명하게 전달 될 수 있기를 바랬습니다.- Jason – Jason

+0

@ Jason : 반복 할 필요가 없습니다. 모든 템플릿은'$ pComposite/myName'과 같은 XPath 표현식을 사용하여 매개 변수를 얻습니다.이 템플릿은 편리하고 유용합니다. –

+0

이 경우 다른 모든 템플릿을 수정하고 pComposite라는 새 매개 변수를 도입해야합니까? – Jason