Создать узлы из строковой переменной - PullRequest
0 голосов
/ 24 марта 2011

Мне нужно создать узлы из строки, пример для этого

root1 / root2 / root3

Я хочу, чтобы он генерировал такие узлы

<node name="root1">
     <node name="root2">
         <node name="root3"/>
     </node>
</node>

Я пыталсяэта таблица стилей

<xsl:template match="/">
   <xsl:variable name="root" select="'root1/root2/root3'"/>
   <xsl:call-template name="createNodes">
    <xsl:with-param name="root" select="$root"/>
   </xsl:call-template>
</xsl:template>

<xsl:template name="createNodes">
    <xsl:param name="root"/>
    <xsl:param name="name"/>
    <xsl:variable name="rootPath" select="tokenize($root,'/') "/>
    <xsl:for-each select="$rootPath">
        <xsl:element name="node">
        <xsl:attribute name="name">
                <xsl:value-of select="."/>
        </xsl:attribute>
            <xsl:call-template name="createNodes">
                <xsl:with-param name="caption" select="$rootPath"/>
            </xsl:call-template>
        </xsl:element>
        </xsl:for-each>
</xsl:template>

Проблема, я получаю этот вывод

<node name="root1">
<node name="root2">
<node name="root3">

Нужна ваша помощь: D

1 Ответ

0 голосов
/ 24 марта 2011

По сути, вместо того, чтобы зацикливаться на каждом элементе, вам нужно разбивать строку, удаляя первый элемент по ходу, таким образом, вы получите вложенный результат.

Это должно работать:

<xsl:template name="createNodes">
  <xsl:param name="root"/>
  <xsl:if test="$root">
    <node name="{substring-before(concat($root,'/'),'/')}">
      <xsl:call-template name="createNodes">
        <xsl:with-param name="root" select="substring-after($root,'/')"/>
      </xsl:call-template>
    </node>
  </xsl:if>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...