【问题标题】:How to auto increment Element / Variable value through XSLT?如何通过 XSLT 自动增加元素/变量值?
【发布时间】:2015-03-30 19:47:07
【问题描述】:

我的问题是我想从 100000 开始将元素标签“BOOKSEQNUM”的值自动增加 10, 请看下面,我已经输入了输入代码、输出代码(我的 XSLT 附带)、XSLT 代码和它应该出现的输出。 如果这在 XSLT 中可行,你能帮我吗?我已经搜索了它的解决方案,但没有找到任何东西。

输入文件:

                <?xml version="1.0" encoding="utf-8"?>
                <r id="TYPL.HB001">
                <COMM>
                <commbody>
                <level id="comchap">
                <level id="TTPL_Z9.0002">
                <level id="TTPL_Z9.0003"/>
                </level>
                <level id="TTPL_Z9.0004.para0">
                <level id="TTPL_Z9.0005" >
                <level id="TTPL_Z9.0006"/>
                <level id="TTPL_Z9.0016"/>
                <level id="TTPL_Z9.0022"/>
                <level id="TTPL_Z9.0031">
                <level id="TTPL_Z9.0041"/>                 
                </level>
                </level>
                <level id="TTPL_Z9.0046">
                <level id="TTPL_Z9.0047"/>
                <level id="TTPL_Z9.0058"/>
                <level id="TTPL_Z9.0063">
                </level>
                </level>
                </level>
                </level>
                </commbody>
                </COMM>
                </r>

XSLT 代码:

            <?xml version="1.0" encoding="UTF-8"?>
            <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            version="2.0"> 
            <xsl:output omit-xml-declaration="yes" indent="yes"/>
            <xsl:template match="/">
            <xsl:apply-templates select="//level"/>
            </xsl:template>
            <xsl:template match="level">
            <xsl:variable name="BSN_Number">100000</xsl:variable>
            <xsl:element name="BOOKSEQNUM">
            <xsl:attribute name="id" select="./@id"/>
            <xsl:for-each select=".">
            <xsl:value-of select="$BSN_Number+10"/>
            </xsl:for-each>
            </xsl:element>       
            </xsl:template>
            </xsl:stylesheet>

即将输出:

            <BOOKSEQNUM id="comchap">100010</BOOKSEQNUM>
    <BOOKSEQNUM id="TTPL_Z9.0002">100010</BOOKSEQNUM>
    <BOOKSEQNUM id="TTPL_Z9.0003">100010</BOOKSEQNUM>
    <BOOKSEQNUM id="TTPL_Z9.0004">100010</BOOKSEQNUM>
    <BOOKSEQNUM id="TTPL_Z9.0005">100010</BOOKSEQNUM>
    <BOOKSEQNUM id="TTPL_Z9.0006">100010</BOOKSEQNUM>
    <BOOKSEQNUM id="TTPL_Z9.0016">100010</BOOKSEQNUM>
    <BOOKSEQNUM id="TTPL_Z9.0022">100010</BOOKSEQNUM>
    <BOOKSEQNUM id="TTPL_Z9.0031">100010</BOOKSEQNUM>
    <BOOKSEQNUM id="TTPL_Z9.0041">100010</BOOKSEQNUM>
    <BOOKSEQNUM id="TTPL_Z9.0046">100010</BOOKSEQNUM>
    <BOOKSEQNUM id="TTPL_Z9.0047">100010</BOOKSEQNUM>
    <BOOKSEQNUM id="TTPL_Z9.0058">100010</BOOKSEQNUM>
    <BOOKSEQNUM id="TTPL_Z9.0063">100010</BOOKSEQNUM>

但我希望输出应该是这样的:

    <BOOKSEQNUM id="comchap">100010</BOOKSEQNUM>
    <BOOKSEQNUM id="TTPL_Z9.0002">100020</BOOKSEQNUM>
    <BOOKSEQNUM id="TTPL_Z9.0003">100030</BOOKSEQNUM>
    <BOOKSEQNUM id="TTPL_Z9.0004">100040</BOOKSEQNUM>
    <BOOKSEQNUM id="TTPL_Z9.0005">100050</BOOKSEQNUM>
    <BOOKSEQNUM id="TTPL_Z9.0006">100060</BOOKSEQNUM>
    <BOOKSEQNUM id="TTPL_Z9.0016">100070</BOOKSEQNUM>
    <BOOKSEQNUM id="TTPL_Z9.0022">100080</BOOKSEQNUM>
    <BOOKSEQNUM id="TTPL_Z9.0031">100090</BOOKSEQNUM>
    <BOOKSEQNUM id="TTPL_Z9.0041">1000100</BOOKSEQNUM>
    <BOOKSEQNUM id="TTPL_Z9.0046">1000110</BOOKSEQNUM>
    <BOOKSEQNUM id="TTPL_Z9.0047">1000120</BOOKSEQNUM>
    <BOOKSEQNUM id="TTPL_Z9.0058">1000130</BOOKSEQNUM>
    <BOOKSEQNUM id="TTPL_Z9.0063">1000140</BOOKSEQNUM>

【问题讨论】:

    标签: xml xslt xslt-1.0 xslt-2.0


    【解决方案1】:

    XSLT 中的变量是不可变的,不能更改。但是,在这种情况下,您只需要使用 position() 函数做一些简单的数学运算

     <xsl:value-of select="10000 + position() * 10"/>
    

    试试这个 XSLT

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
        <xsl:output omit-xml-declaration="yes" indent="yes"/>
    
        <xsl:template match="/">
            <xsl:apply-templates select="//level"/>
        </xsl:template>
    
        <xsl:template match="level">
            <BOOKSEQNUM id="{@id}">
                <xsl:value-of select="10000 + position() * 10"/>
            </BOOKSEQNUM>       
        </xsl:template>
    </xsl:stylesheet>
    

    作为旁注,不需要使用xsl:element 来创建具有静态名称的元素,直接写出元素名称即可。还要注意在创建id 属性时使用属性值模板。

    【讨论】:

    • 非常感谢蒂姆,您解决了我的问题。通过您上面的代码,我得到了我想要的完美输出,并且还想知道它可以通过 position() 函数完成!!!
    猜你喜欢
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多