Как создать в xslt дерево в переменной - PullRequest
0 голосов
/ 31 мая 2011

Я хочу создать такую ​​переменную:

<xsl:variable name="mytree" >
     <foos>
        <foo>bar</foo>
        <foo>bar</foo>
        <foo>bar</foo>
        <foo>bar</foo>
     <foos>
</xsl:variable>

чтобы использовать его как в:

<xsl:call-template name="myTemplate">
<xsl:with-param name='aTree' select='$mytree' />
</xsl:call-template>

<xsltemplate name="myTemplate">
<xsl:param name="aTree" />
[My code that treat $aTree like a Tree]
</xsl:template>

Мой вопрос: возможно ли создать переменную Tree и как?

1 Ответ

3 голосов
/ 31 мая 2011

Для этого вам, вероятно, необходимо использовать функцию расширения, а именно функцию набор узлов , которая возвращает набор узлов из фрагмента дерева результатов.

Сначала вам нужно определить пространство имен для функций расширения, например:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt">

В этом случае я использую функции расширения Microsoft, но другие доступны в зависимости от используемой платформы. (http://exslt.org/common является еще одним распространенным для платформ, не принадлежащих Microsoft).

Затем вы можете получить доступ к элементам вашей переменной следующим образом (в качестве примера)

<xsl:apply-templates select="msxsl:node-set($aTree)/foos/foo"/>

Совокупность всего этого в простом примере дает вам

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">

   <xsl:variable name="mytree">
      <foos>
         <foo>bar1</foo>
         <foo>bar2</foo>
         <foo>bar3</foo>
         <foo>bar4</foo>
      </foos>
   </xsl:variable>

   <xsl:template match="/">
      <xsl:call-template name="myTemplate">
         <xsl:with-param name="aTree" select="$mytree"/>
      </xsl:call-template>
   </xsl:template>

   <xsl:template name="myTemplate">
      <xsl:param name="aTree"/>
      <newfoos>
         <xsl:apply-templates select="msxsl:node-set($aTree)/foos/foo"/>
      </newfoos>
   </xsl:template>

   <xsl:template match="foo">
      <newfoo>
         <xsl:value-of select="text()"/>
      </newfoo>
   </xsl:template>
</xsl:stylesheet>

При запуске просто выводится следующий результат:

<newfoos>
   <newfoo>bar1</newfoo>
   <newfoo>bar2</newfoo>
   <newfoo>bar3</newfoo>
   <newfoo>bar4</newfoo>
</newfoos>

Учитывая этот пример, нет никаких причин, по которым вы не можете сначала динамически создать переменную myTree .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...