Xml XSLT2.0:<;xsl:number>&引用;初始化";
有没有办法“初始化”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/>
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中只有两个嵌套级别,那就没问题了。