访问递归函数中的变量

发布于 2024-11-10 04:53:13 字数 1516 浏览 0 评论 0 原文

我正在创建一个递归 XSLT 函数,该函数在所有 Xml 文件子文件上运行。

<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

I am creating a recursive XSLT function that run over all the Xml file child ..

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

While running the XSLT, I need to get the variable root node value, where I am
because when calling the root variable, I get the node with all the children node, but all I need is the single value of the node, and as it is recursive i can't act on the child node tags because it always changes. So how can I get the variable single specific value in anytime?
Neither $root nor " . " works.

XSL code:

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

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

what should if put as a code line in place of * so the solution would show:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

淡水深流 2024-11-17 04:53:13

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

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

The wanted processing can be implemented efficiently and without explicit recursion:

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

When this transformation is applied on the provided XML document:

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

the wanted result is produced:

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

and it is displayed in the browser as:

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

无声无音无过去 2024-11-17 04:53:13

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

否则,您需要做的是有两个参数,其中一个参数与每次调用时完全相同地传递,以及调用 并定义 紧接在 下方。然后,您可以在需要在堆栈顶部传入的原始值的任何地方使用 $baseroot 代替 $root。

You have two choices: If this is only going to be used in one place, you could create a variable in the stylesheet root and use that globally.

Otherwise, what you'll need to do is have two parameters, one of which is passed exactly as is on each call, so as well as calling <xsl:with-param name="root" select="." />, you also add <xsl:with-param name="baseroot" select="$baseroot" /> and define <xsl:param name="baseroot" select="$root" /> immediately below your <xsl:param name="root" />. Then you can use $baseroot in place of $root anywhere that you need the original value that was passed in at the top of the stack.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文