在递归函数中访问变量

时间:2011-05-27 08:17:50

标签: xslt

我正在创建一个遍历所有Xml文件子项的递归XSLT函数..

<xsl:call-template name="testing">
  <xsl:with-param name="root" select="ItemSet"></xsl:with-param>
</xsl:call-template>

在运行XSLT时,我需要获取变量根节点值,我在哪里 因为在调用根变量时,我得到了包含所有子节点的节点,但我只需要节点的单个值,并且因为它是递归的,所以我不能对子节点标签起作用,因为它总是会改变。那么如何在任何时候获得变量单个特定值? $root" . "都不起作用。

XSL代码:

                   

    

<xsl:variable name="trial" select="count(./*)"></xsl:variable>
<xsl:choose>
  <xsl:when test="count(./*) = 0">


    :<xsl:value-of select="$root" /> <br/>


  </xsl:when>
  <xsl:otherwise>



         <xsl:for-each select="./*">

        <xsl:call-template name="testing">
          <xsl:with-param name="root" select=".">

          </xsl:with-param>
        </xsl:call-template>

    </xsl:for-each>
  </xsl:otherwise>
</xsl:choose>

XML代码:

<ItemSet>
  <Item>
    1
    <iteml1>
      1.1
    </iteml1>
    <iteml1>
      1.2
    </iteml1>
  </Item>

  <Item>
    2
    <iteml1>
      2.1
      <iteml2>
        2.1.1
      </iteml2>
    </iteml1>
  </Item>
</ItemSet>

如果作为代码行代替 * 应该怎么做,所以解决方案会显示:

1
1: 1.1 :
1: 1.2
2
2: 2.1
2: 2.1: 2.1.2

2 个答案:

答案 0 :(得分:0)

您有两种选择:如果只在一个地方使用,您可以在样式表根目录中创建一个变量并全局使用。

否则,您需要做的是有两个参数,其中一个参数与每个调用完全相同,因此调用<xsl:with-param name="root" select="." />时,您还需要添加<xsl:with-param name="baseroot" select="$baseroot" />并定义<xsl:param name="baseroot" select="$root" />正好位于<xsl:param name="root" />之下。然后,您可以使用$ baseroot代替$ root,只需要在堆栈顶部传递的原始值。

答案 1 :(得分:0)

可以有效地实现所需的处理,而无需显式递归:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes"/>

 <xsl:template match="*[parent::*]">
   <xsl:param name="pPath"/>
     <xsl:value-of select="$pPath"/>

  <xsl:variable name="vValue" select=
   "normalize-space(text()[1])"/>
  <xsl:value-of select="$vValue"/> <br/>

    <xsl:apply-templates select="*">
     <xsl:with-param name="pPath" select=
      "concat($pPath, $vValue, ': ')"/>
    </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="text()"/>
</xsl:stylesheet>

在提供的XML文档上应用此转换时:

<ItemSet>
    <Item>
     1
        <iteml1>
         1.1
        </iteml1>
        <iteml1>
         1.2
        </iteml1>
    </Item>

 <Item>
    2     
        <iteml1>
         2.1       
            <iteml2>
             2.1.1
            </iteml2>
        </iteml1>
    </Item>
</ItemSet>

生成了想要的结果

1<br/>1: 1.1<br/>1: 1.2<br/>2<br/>2: 2.1<br/>2: 2.1: 2.1.1<br/>

,并在浏览器中显示为

1
1:1.1
1:1.2
2
2:2.1第2:2.1:2.1.1