小编use*_*780的帖子

编写用于计算新值的递归函数XSLT/XPath

我正在尝试编写一个计算新值的递归函数.什么激励我的基本想法是,给定水平的轮廓,我想计算新的水平,使得数字总是连续的(也就是说,你不能立即从第2级到第5级),但同时尊重原始关系.

给定这样的输入(注意输入可能完全不同):

<root>
    <item outlinePos="1">yo</item>
    <item outlinePos="2">yo</item>
    <item outlinePos="2">yo</item>
    <item outlinePos="4">yo</item>
    <item outlinePos="1">yo</item>
    <item outlinePos="8">yo</item>
    <item outlinePos="8">yo</item>
    <item outlinePos="9">yo</item>
    <item outlinePos="3">yo</item>
    <item outlinePos="8">yo</item>
    <item outlinePos="4">yo</item>
</root>
Run Code Online (Sandbox Code Playgroud)

我想要这个输出

<root>
    <item outlinePos="0">yo</item>
    <item outlinePos="1">yo</item>
    <item outlinePos="1">yo</item>
    <item outlinePos="2">yo</item>
    <item outlinePos="0">yo</item>
    <item outlinePos="1">yo</item>
    <item outlinePos="1">yo</item>
    <item outlinePos="2">yo</item>
    <item outlinePos="1">yo</item>
    <item outlinePos="2">yo</item>
    <item outlinePos="2">yo</item>
</root>
Run Code Online (Sandbox Code Playgroud)

我正在使用XSLT 2/XPath 2.这是我到目前为止,但我没有得到正确的结果,我知道问题在哪里(从输入数据中的第五项开始); 我已经包含了解释我正在尝试做什么的评论:

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="item[@outlinePos]">
    <xsl:element name="item">
        <xsl:attribute name="outlinePos" select="test:newLevel(.)"/>
        <xsl:apply-templates select="@*[name(.)!='outlinePos'] | node()"/>
    </xsl:element>
</xsl:template>

<xsl:function name="test:newLevel">
    <xsl:param name="context"/>
    <xsl:choose> …
Run Code Online (Sandbox Code Playgroud)

xslt xslt-2.0

3
推荐指数
1
解决办法
2485
查看次数

标签 统计

xslt ×1

xslt-2.0 ×1