Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSLT2.0:<;xsl:number>&引用;初始化";_Xml_Xslt_Xslt 2.0 - Fatal编程技术网

Xml XSLT2.0:<;xsl:number>&引用;初始化";

Xml XSLT2.0:<;xsl:number>&引用;初始化";,xml,xslt,xslt-2.0,Xml,Xslt,Xslt 2.0,有没有办法“初始化”xsl:number元素生成的序列 例如,如果数字将产生以下输出: 1 1.1 1.1.1 我希望将其初始化为2,例如,它将产生以下结果: 2 2.1 2.1.1 等等 有没有机会或者我必须创建自己的函数/模板来实现这一点?我认为在属性上有一个开始,但您需要使用Saxon 9.6 PE或EE和XSLT 3.0来实现这一点。事实上,我认为这不可行,但似乎确实可行: 对于此示例,输入xml: <root> <item/>

有没有办法“初始化”xsl:number元素生成的序列

例如,如果数字将产生以下输出:

1  
1.1  
1.1.1
我希望将其初始化为2,例如,它将产生以下结果:

2  
2.1  
2.1.1
等等


有没有机会或者我必须创建自己的函数/模板来实现这一点?

我认为在属性上有一个
开始,但您需要使用Saxon 9.6 PE或EE和XSLT 3.0来实现这一点。

事实上,我认为这不可行,但似乎确实可行:

对于此示例,输入xml:

<root>
    <item/>
    <item>
        <item/>
    </item>
    <item/>
    <item/>
    <item/>
</root>

并使用此XSLT测试转换:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <result>
            <xsl:apply-templates/>
        </result>
    </xsl:template>
    <xsl:template match="item">
        <xsl:variable name="currItem">
            <xsl:number count="item" level="multiple"/>
        </xsl:variable>
        <item numer="{$currItem+1}"/>
        <xsl:apply-templates/>
    </xsl:template>
</xsl:stylesheet>

你可以做到这一点。请注意$currItem+1,这是进行初始化的地方

因此,结果是:

<?xml version="1.0" encoding="UTF-8"?>
<result>
    <item numer="2"/>
    <item numer="3"/>
    <item numer="3.1"/>
    <item numer="4"/>
    <item numer="5"/>
    <item numer="6"/>
</result>


这实际上很可能成为新的XSLT 3.0规范。有一个公开的bug报告,请参阅,如果被接受(看起来是这样的),它将为您提供更多的表达自由
xsl:number
从每个级别的值开始


当然,这需要使用XSLT 3.0处理器。

非常感谢您的快速回答,但遗憾的是,我目前只能使用只理解XSLT 2.0的AltovaXML。有没有办法使用XSLT2.0引擎实现这一点?鉴于XSLT3.0认为有必要引入这个新属性,我认为XSLT2.0没有这样的功能可以轻松创建以某个整数值开头的数字。我会尝试将
xsl:number
结果存储在一个变量中,然后尝试操作它的组件,例如
。老实说,我和你一样认为,我必须处理字符串结果,将其标记化,但我的答案似乎更简单。请让我知道,如果你看到任何可能不工作在某些情况下。无论如何,非常感谢您的回答,谢谢。在@tim-c的评论之后,我意识到您的解决方案是正确的,我没有意识到在我建议的解决方案中,该数字被解释为xs:double类型。我认为,如果嵌套深度为3级或以上,则此操作将失败。在这种情况下,它将尝试将1添加到3.1.1,并得到一个错误!不过,如果您的XML中只有两个嵌套级别,那就没问题了。