当前位置: 首页 > 知识库问答 >
问题:

XSLT 1.0实现递归模板的问题

商瀚
2023-03-14

我对XSLT很陌生,并且一直在努力实现递归模板,它通过多个文本节点并搜索匹配项。创建递归模板时,我收到一条错误消息,说“/的第一个操作数的必需项类型是node();提供的值具有项类型xs: string”。我不知道如何选择多个节点作为节点,而不是字符串。

目标:我有多个测试节点,如

<Chain>1 3 4 7 20 50 72 ...</Chain>

我想遍历这些节点以寻找匹配的数字。当找到这个数字时,我需要选择父元素属性的子字符串。

下面是带有递归模板的样式表的一部分:

<xsl:template match="/l:LandXML/h:HexagonLandXML/h:Point/h:PointCode">
<xsl:variable name="id2" select="../@uniqueID"/>
  <xsl:call-template name="tests">
  <xsl:with-param name="input" select="/l:LandXML/h:HexagonLandXML/h:PlanFeature/h:CoordGeom/h:Spline/h:Chain"/>
  <xsl:with-param name="id" select="$id2"/>
  </xsl:call-template>
</xsl:template>

<xsl:template name="tests">
<xsl:param name="id"/>
<xsl:param name="input"/>
<xsl:choose>
    <xsl:when test="substring-before($input, ' ') = $id">
        <xsl:value-of select="format-number(substring-before(substring-after($input/../@oID, '_'), '_'), '#')"/>
    </xsl:when>
    <xsl:otherwise>
        <xsl:call-template name="tests">
            <xsl:with-param name="input" select="substring-after($input, ' ')"/>
            <xsl:with-param name="id" select="$id"/>
        </xsl:call-template>
    </xsl:otherwise>
</xsl:choose>
</xsl:template>

为了更好地理解,完整的XML和XSLT在这里:https://xsltfiddle.liberty-development.net/94hvTzd/17

提前感谢您的帮助。

共有2个答案

皮煜
2023-03-14

您在<代码>

邹英光
2023-03-14

所以你想知道

<Chain>1 3 4 7 20 50 72 ...</Chain>

包含,例如,50?

这里不需要递归模板。XPath字符串函数可以很好地做到这一点。对于XPath 1.0,使用

//Chain[contains(concat(' ', ., ' '), concat(' ', $val, ' '))]

其中,$val'50'。concat()确保没有部分匹配,并且在开始和结束处找到匹配。

对于XPath 2.0及更高版本,您可以使用Tokenize()

//Chain[tokenize(., ' ') = $val]
 类似资料:
  • 问题 你使用访问者模式遍历一个很深的嵌套树形数据结构,并且因为超过嵌套层级限制而失败。 你想消除递归,并同时保持访问者编程模式。 解决方案 通过巧妙的使用生成器可以在树遍历或搜索算法中消除递归。 在8.21小节中,我们给出了一个访问者类。 下面我们利用一个栈和生成器重新实现这个类: import types class Node: pass class NodeVisitor:

  • 假设不是将递归调用的结果与来自 convertString 的字符串拼接到 toStr,我们修改了算法,以便在进行递归调用之前将字符串入栈。此修改的算法的代码展示在 ActiveCode 1 中。 from pythonds.basic.stack import Stack rStack = Stack() def toStr(n,base): convertString =

  • 我想递归遍历LinkedHashMap的键和值,并使用ApacheFreeMarker将它们打印到模板中。LinkedHashMap包含作为字符串的键和作为对象的值。这些值可以是LinkedHashMap、ArrayList或字符串。 下面的java源代码返回我想使用freemarker创建的字符串。 输出为: freemarker模板包含以下部分。 使用此模板时,将显示以下错误: 错误显示“ob

  • 本文向大家介绍C++实现递归函数的方法,包括了C++实现递归函数的方法的使用技巧和注意事项,需要的朋友参考一下 递归函数通俗来讲就是自己调用自己本身。这样有很大的好处,代码很方便简洁,把复杂的有规律的运算交给计算机去做。 1、首先定义问题。递归函数(recursion)需要设置一个函数,然后再可以循环往复的执行下去。 2、把问题换成公式。 如把阶乘之和定义为f(n)=n*f(n-1)。也就是说n*

  • 本文向大家介绍JAVA递归与非递归实现斐波那契数列,包括了JAVA递归与非递归实现斐波那契数列的使用技巧和注意事项,需要的朋友参考一下 斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci[1] )以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、…

  • 本文向大家介绍Javascript 实现匿名递归的实例代码,包括了Javascript 实现匿名递归的实例代码的使用技巧和注意事项,需要的朋友参考一下 递归是一种常见的编程技巧,实名递归相信大家都不陌生,但如果想要实现匿名递归呢?比如想要返回一个匿名递归函数,又或者是定义一个匿名递归函数并直接调用它,该怎样去做呢?本文将来探讨一下它的实现。 实名递归 我们还是先从实名递归说起吧,还是用那个最简单的