Java XSLT生成可重置的序列号 0 20110707 2949801 福 20110707 2949802 酒吧

Java XSLT生成可重置的序列号 0 20110707 2949801 福 20110707 2949802 酒吧,java,xml,xslt,Java,Xml,Xslt,对于上面的XML,您将如何编写XSLT转换来生成管道分隔的输出,每个行项目都有一个连续的“行项目”计数?每次发票号更改时,行项目计数应重置为1。此XSLT 2.0转换: <?xml version="1.0" encoding="UTF-8" ?> <FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult"> <ERRORCODE>0</ERRORCODE> <PRO

对于上面的XML,您将如何编写XSLT转换来生成管道分隔的输出,每个行项目都有一个连续的“行项目”计数?每次发票号更改时,行项目计数应重置为1。

此XSLT 2.0转换:

<?xml version="1.0" encoding="UTF-8" ?>
<FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
    <ERRORCODE>0</ERRORCODE>
    <PRODUCT BUILD="01-25-2011" NAME="FileMaker" VERSION="Pro 11.0v3"/>
    <DATABASE DATEFORMAT="M/d/yyyy" LAYOUT="Export to Ledes" NAME="StateFarmLedes1998b.fp7" RECORDS="27" TIMEFORMAT="h:mm:ss a"/>
    <METADATA>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="date of bill" TYPE="DATE"/>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Invoice #" TYPE="NUMBER"/>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Company Name" TYPE="TEXT"/>
    </METADATA>
    <RESULTSET FOUND="25">
        <ROW MODID="25" RECORDID="54">
            <COL>
                <DATA>20110707</DATA>
            </COL>
            <COL>
                <DATA>2949801</DATA>
            </COL>
            <COL>
                <DATA>Foo</DATA>
            </COL>
        </ROW>
        <ROW MODID="25" RECORDID="54">
            <COL>
                <DATA>20110707</DATA>
            </COL>
            <COL>
                <DATA>2949802</DATA>
            </COL>
            <COL>
                <DATA>Bar</DATA>
            </COL>
        </ROW>
    </RESULTSET>
</FMPXMLRESULT>
<FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
    <ERRORCODE>0</ERRORCODE>
    <PRODUCT BUILD="01-25-2011" NAME="FileMaker" VERSION="Pro 11.0v3"/>
    <DATABASE DATEFORMAT="M/d/yyyy" LAYOUT="Export to Ledes" NAME="StateFarmLedes1998b.fp7" RECORDS="27" TIMEFORMAT="h:mm:ss a"/>
    <METADATA>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="date of bill" TYPE="DATE"/>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Invoice #" TYPE="NUMBER"/>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Company Name" TYPE="TEXT"/>
    </METADATA>
    <RESULTSET FOUND="25">
        <ROW MODID="25" RECORDID="54">
            <COL>
                <DATA>20110707</DATA>
            </COL>
            <COL>
                <DATA>2949801</DATA>
            </COL>
            <COL>
                <DATA>Foo</DATA>
            </COL>
        </ROW>
        <ROW MODID="25" RECORDID="54">
            <COL>
                <DATA>20110707</DATA>
            </COL>
            <COL>
                <DATA>2949801</DATA>
            </COL>
            <COL>
                <DATA>Foo</DATA>
            </COL>
        </ROW>
        <ROW MODID="25" RECORDID="54">
            <COL>
                <DATA>20110707</DATA>
            </COL>
            <COL>
                <DATA>2949802</DATA>
            </COL>
            <COL>
                <DATA>Bar</DATA>
            </COL>
        </ROW>
    </RESULTSET>
</FMPXMLRESULT>
1,20110707,2949801,Foo
2,20110707,2949801,Foo
1,20110707,2949802,Bar
说明

<?xml version="1.0" encoding="UTF-8" ?>
<FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
    <ERRORCODE>0</ERRORCODE>
    <PRODUCT BUILD="01-25-2011" NAME="FileMaker" VERSION="Pro 11.0v3"/>
    <DATABASE DATEFORMAT="M/d/yyyy" LAYOUT="Export to Ledes" NAME="StateFarmLedes1998b.fp7" RECORDS="27" TIMEFORMAT="h:mm:ss a"/>
    <METADATA>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="date of bill" TYPE="DATE"/>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Invoice #" TYPE="NUMBER"/>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Company Name" TYPE="TEXT"/>
    </METADATA>
    <RESULTSET FOUND="25">
        <ROW MODID="25" RECORDID="54">
            <COL>
                <DATA>20110707</DATA>
            </COL>
            <COL>
                <DATA>2949801</DATA>
            </COL>
            <COL>
                <DATA>Foo</DATA>
            </COL>
        </ROW>
        <ROW MODID="25" RECORDID="54">
            <COL>
                <DATA>20110707</DATA>
            </COL>
            <COL>
                <DATA>2949802</DATA>
            </COL>
            <COL>
                <DATA>Bar</DATA>
            </COL>
        </ROW>
    </RESULTSET>
</FMPXMLRESULT>
<FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
    <ERRORCODE>0</ERRORCODE>
    <PRODUCT BUILD="01-25-2011" NAME="FileMaker" VERSION="Pro 11.0v3"/>
    <DATABASE DATEFORMAT="M/d/yyyy" LAYOUT="Export to Ledes" NAME="StateFarmLedes1998b.fp7" RECORDS="27" TIMEFORMAT="h:mm:ss a"/>
    <METADATA>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="date of bill" TYPE="DATE"/>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Invoice #" TYPE="NUMBER"/>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Company Name" TYPE="TEXT"/>
    </METADATA>
    <RESULTSET FOUND="25">
        <ROW MODID="25" RECORDID="54">
            <COL>
                <DATA>20110707</DATA>
            </COL>
            <COL>
                <DATA>2949801</DATA>
            </COL>
            <COL>
                <DATA>Foo</DATA>
            </COL>
        </ROW>
        <ROW MODID="25" RECORDID="54">
            <COL>
                <DATA>20110707</DATA>
            </COL>
            <COL>
                <DATA>2949801</DATA>
            </COL>
            <COL>
                <DATA>Foo</DATA>
            </COL>
        </ROW>
        <ROW MODID="25" RECORDID="54">
            <COL>
                <DATA>20110707</DATA>
            </COL>
            <COL>
                <DATA>2949802</DATA>
            </COL>
            <COL>
                <DATA>Bar</DATA>
            </COL>
        </ROW>
    </RESULTSET>
</FMPXMLRESULT>
1,20110707,2949801,Foo
2,20110707,2949801,Foo
1,20110707,2949802,Bar
组相邻属性一起使用

II。XSLT 1.0解决方案

<?xml version="1.0" encoding="UTF-8" ?>
<FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
    <ERRORCODE>0</ERRORCODE>
    <PRODUCT BUILD="01-25-2011" NAME="FileMaker" VERSION="Pro 11.0v3"/>
    <DATABASE DATEFORMAT="M/d/yyyy" LAYOUT="Export to Ledes" NAME="StateFarmLedes1998b.fp7" RECORDS="27" TIMEFORMAT="h:mm:ss a"/>
    <METADATA>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="date of bill" TYPE="DATE"/>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Invoice #" TYPE="NUMBER"/>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Company Name" TYPE="TEXT"/>
    </METADATA>
    <RESULTSET FOUND="25">
        <ROW MODID="25" RECORDID="54">
            <COL>
                <DATA>20110707</DATA>
            </COL>
            <COL>
                <DATA>2949801</DATA>
            </COL>
            <COL>
                <DATA>Foo</DATA>
            </COL>
        </ROW>
        <ROW MODID="25" RECORDID="54">
            <COL>
                <DATA>20110707</DATA>
            </COL>
            <COL>
                <DATA>2949802</DATA>
            </COL>
            <COL>
                <DATA>Bar</DATA>
            </COL>
        </ROW>
    </RESULTSET>
</FMPXMLRESULT>
<FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
    <ERRORCODE>0</ERRORCODE>
    <PRODUCT BUILD="01-25-2011" NAME="FileMaker" VERSION="Pro 11.0v3"/>
    <DATABASE DATEFORMAT="M/d/yyyy" LAYOUT="Export to Ledes" NAME="StateFarmLedes1998b.fp7" RECORDS="27" TIMEFORMAT="h:mm:ss a"/>
    <METADATA>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="date of bill" TYPE="DATE"/>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Invoice #" TYPE="NUMBER"/>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Company Name" TYPE="TEXT"/>
    </METADATA>
    <RESULTSET FOUND="25">
        <ROW MODID="25" RECORDID="54">
            <COL>
                <DATA>20110707</DATA>
            </COL>
            <COL>
                <DATA>2949801</DATA>
            </COL>
            <COL>
                <DATA>Foo</DATA>
            </COL>
        </ROW>
        <ROW MODID="25" RECORDID="54">
            <COL>
                <DATA>20110707</DATA>
            </COL>
            <COL>
                <DATA>2949801</DATA>
            </COL>
            <COL>
                <DATA>Foo</DATA>
            </COL>
        </ROW>
        <ROW MODID="25" RECORDID="54">
            <COL>
                <DATA>20110707</DATA>
            </COL>
            <COL>
                <DATA>2949802</DATA>
            </COL>
            <COL>
                <DATA>Bar</DATA>
            </COL>
        </ROW>
    </RESULTSET>
</FMPXMLRESULT>
1,20110707,2949801,Foo
2,20110707,2949801,Foo
1,20110707,2949802,Bar
说明

  • 我们使用的模板匹配每个“组头”
    x:ROW
    元素

  • 我们指定了一个键,它通过“组头”的
    generate-id()
    索引组中的任何
    x:ROW
    。这样可以方便地指定整个组,并在其元素上应用模板(在“组”模式下)


  • 使用基于前面同级的
    计数
    xpath表达式@Mike,我可以测试的XSL将非常棒。当发票编号发生变化时,您将如何重置编号?@Sam-您能给出上述xml所需输出的示例吗?@Sam,发票编号是否为第二个
    。如果是这样的话,我想我需要知道表达式出现时正在处理什么,这样我就可以创建一个Xpath表达式来标识包含行的先前同级。这不是答案,但我见过的最好的非简单xslt是Kathleen Dollard的代码生成.Net()的源代码如果您想看到一些关于如何使用xml/xslt完成一些复杂工作的示例,请查看她的资料。虽然她只是提供了xslt,但是您需要一个很好的语言语法参考,才能像理解一样理解它,谢谢!我需要将XSLT1.0用于我的解决方案,但我可以理解2.0有多干净。+1-在没有示例输出的情况下,理解了OP的意思。