2011-12-02 5 views
2

call-template 요소의 name 속성에서 Xpath를 사용할 수없는 것처럼 보입니다. 이 문제를 어떻게 해결할 수 있습니까? 어떤 도움이나 생각이 굉장 할 것입니다!XSLT 호출 템플릿 이름 속성

<xsl:for-each select="child::knomaddb/Content/Videos"> 
     <xsl:result-document method="xhtml" href="{local-name()}.html"> 
      <html> 
       <body> 
        <h1>Knomad</h1> 
        <h2>{local-name()} Videos</h2> 
        <table border="1"> 
         <tr bgcolor="#9acd32"> 
          <th>Title</th> 
          <th>Video</th> 
          <th>Description</th> 
          <th>Comments</th> 
         </tr> 
         <xsl:for-each select="Video"> 
          <xsl:call-template name="{ancestor::local-name()}"/> 
         </xsl:for-each> 
        </table> 
       </body> 
      </html> 
     </xsl:result-document> 
    </xsl:for-each> 
+3

문제를 해결하기 위해 적용 템플릿 및 템플릿 규칙을 사용해 보셨습니까? call-template 명령은 name 속성에서 xpath 표현식을 허용하지 않으므로 명시 적으로 이름을 설정해야합니다. – riff

+0

xsl : apply-templates를 재발견하려는 것 외에도 XPath 표현식 ancestor :: local-name()은 유효한 XPath 표현식이 아니며 아마도 하나 이상의 이름을 선택한다면, 노드에는 여러 조상이 있기 때문입니다. –

답변

1

보인다. 이 문제를 어떻게 해결할 수 있습니까?

좋은 질문, +1.

수 없습니다. 대신 <xsl:apply-templates>을 사용할 수 있습니다. 여기

가 빠른 데모입니다 :

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:double="double" xmlns:incr="incr" xmlns:my="my:my" 
exclude-result-prefixes="double incr my" 
> 
    <xsl:output method="text"/> 

    <double:double/> 
    <incr:incr/> 

    <xsl:variable name="vFuncDouble" 
     select="document('')/*/double:*[1]"/> 

    <xsl:variable name="vFuncIncr" 
     select="document('')/*/incr:*[1]"/> 

    <xsl:function name="my:double"> 
    <xsl:param name="arg1" /> 

     <xsl:sequence select="2*$arg1"/> 
    </xsl:function> 

    <xsl:function name="my:incr"> 
    <xsl:param name="arg1" /> 

     <xsl:sequence select="1+$arg1"/> 
    </xsl:function> 

    <xsl:template name="double" match="double:*"> 
     <xsl:param name="arg1"/> 

     <xsl:sequence select="my:double($arg1)"/> 
    </xsl:template> 

    <xsl:template name="incr" match="incr:*"> 
     <xsl:param name="arg1"/> 

     <xsl:sequence select="my:incr($arg1)"/> 
    </xsl:template> 

    <xsl:function name="my:apply"> 
     <xsl:param name="pFun" as="element()"/> 
     <xsl:param name="arg1"/> 

     <xsl:apply-templates select="$pFun"> 
     <xsl:with-param name="arg1" select="$arg1"/> 
     </xsl:apply-templates> 
    </xsl:function> 

    <xsl:template match="/"> 
    <xsl:sequence select="my:apply($vFuncIncr, my:apply($vFuncDouble,2))"/> 
    </xsl:template> 
</xsl:stylesheet> 

이러한 변화가 어떤 XML 문서 (사용되지 않음)에 적용, 원하는 결과가 생성됩니다

5 

하는 메모를 수행 :

하나는 매개 변수로 전달할 수 있습니다. er (첫 번째 인수)를 my:apply() "function"으로 변경하고my:apply()을 두 번째 인수에 적용합니다.

XSLT 1.0과 XSLT 2.0에서이 같은 원리 the FXSL library 구현 높은 주문 기능 (HOFs)를 사용하여 - read more here. 향후 XPath 3.0 기능한다

Xpath Data Model (XDM)에서 처음 일류 개체이다.