从字符串变量创建节点

时间:2011-03-24 11:37:33

标签: xslt

我需要从string创建节点,例如

目录root1 /根-2 / 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 :(得分:0)

基本上而不是循环遍历每个项目,你需要在你去的时候分解删除第一个项目的字符串,这样你就会得到一个嵌套的结果。

这应该有效:

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