Атрибут имени шаблона вызова XSLT - PullRequest
2 голосов
/ 03 декабря 2011

Кажется, что я не могу использовать Xpath в атрибуте name элемента call-template. Как я могу обойти это? Любая помощь / мысли будут потрясающими!

<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>

Ответы [ 2 ]

1 голос
/ 03 декабря 2011

Кажется, что я не могу использовать Xpath в атрибуте name элемента call-template.Как я могу обойти это?

Хороший вопрос, + 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

Заметка :

В качестве параметра (первый аргумент) можно передать my:apply()любая «функция» и my:apply() будут применять ее ко второму аргументу .

Используя этот же принцип библиотека FXSL реализовал функции высшего порядка (HOF) в XSLT 1.0 и XSLT 2.0 - подробнее здесь .

В следующих XPath 3.0 * Функции 1045 * впервые являются первоклассными объектами в Модель данных Xpath (XDM).

0 голосов
/ 03 декабря 2011

Это по замыслу.xsl:call-template is определяется следующим образом :

<!-- Category: instruction -->
<xsl:call-template
  name = qname>
  <!-- Content: xsl:with-param* -->
</xsl:call-template>

Атрибут name должен быть квалифицированным именем , а не выражением XPath.

Источники:

...