XML数据适配器的组数据

XML数据适配器的组数据,xml,jasper-reports,Xml,Jasper Reports,我需要一些关于JasperReports的帮助,我正在尝试从XML文件创建一个报告作为数据适配器,我拥有的元素列表如下所示: 级别:6至5级 -专业:没有专业 级别:5至4级 -专业:没有专业 级别:首先进行级别测试 -专业:专业测试-t -专业:专业测试-t2 我也想这样打印,但在报告中,只有第一个级别打印了每个级别的第一个专业,如下所示: 级别:6至5级 -专业:没有专业 -专业:没有专业 -专业:专业测试-t 我开始怀疑是否可以将组与XML数据适配器一起使用,因为到目前为止我发现的所有示例

我需要一些关于JasperReports的帮助,我正在尝试从XML文件创建一个报告作为数据适配器,我拥有的元素列表如下所示:

级别:6至5级 -专业:没有专业 级别:5至4级 -专业:没有专业 级别:首先进行级别测试 -专业:专业测试-t -专业:专业测试-t2

我也想这样打印,但在报告中,只有第一个级别打印了每个级别的第一个专业,如下所示:

级别:6至5级 -专业:没有专业 -专业:没有专业 -专业:专业测试-t

我开始怀疑是否可以将组与XML数据适配器一起使用,因为到目前为止我发现的所有示例都使用SQL数据适配器

以下是包含数据的XML:

<person>
<id>11111</id>
<employeeNumber>12887</employeeNumber>
<name>NAME EXAMPLE </name>
<location>3333</location>
<plan>
    <planId>68</planId>
    <planName>Plan Test</planName>
    <plant/>
    <levels>
        <level>
            <item>
            <description>Level 6 to 5</description>
            <id>1</id>
            <name>Level 6 to 5</name>
            </item>
            <specialities>
                <speciality>
                    <item>
                        <id>0</id>
                        <name>No Speciality</name>
                    </item>
                    <courses/>
                </speciality>
            </specialities>
        </level>
        <level>
            <item>
                <description>Level 5 to 4</description>
                <id>20</id>
                <name>Level 5 to 4</name>
            </item>
            <specialities>
                <speciality>
                    <item>
                        <id>0</id>
                        <name>No Speciality</name>
                    </item>
                    <courses/>
                </speciality>
            </specialities>
        </level>
        <level>
            <item>
                <description>level-test-first</description>
                <id>19</id>
                <name>level-test-first</name>
            </item>
            <specialities>
                <speciality>
                    <item>
                        <description>Speciality Test-t</description>
                        <id>9</id>
                        <name>Speciality Test-t</name>
                    </item>
                </speciality>
                <speciality>
                    <item>
                        <description>Speciality Test-t2</description>
                        <id>10</id>
                        <name>Speciality Test-t2</name>
                    </item>
                    <courses/>
                </speciality>
            </specialities>
        </level>
    </levels>
</plan>

11111
12887
名称示例
3333
68
计划测试
6至5级
1.
6至5级
0
没有特长
第5至4级
20
第5至4级
0
没有特长
先进行水平测试
19
先进行水平测试
专业测验
9
专业测验
专业测试-t2
10
专业测试-t2

这是我的报告:

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="pruebaGrupos" language="groovy" pageWidth="612" pageHeight="792" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="f9c990e6-305b-46fe-b9ad-f1c992e1cbb9">
<property name="ireport.zoom" value="1.0"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="39"/>
<queryString language="XPath">
    <![CDATA[/person/plan/levels/level]]>
</queryString>
<field name="levels" class="java.lang.String">
    <fieldDescription><![CDATA[/person/plan/levels]]></fieldDescription>
</field>
<field name="level" class="java.lang.String">
    <fieldDescription><![CDATA[/person/plan/levels/level]]></fieldDescription>
</field>
<field name="item" class="java.lang.String">
    <fieldDescription><![CDATA[/person/plan/levels/level/item]]></fieldDescription>
</field>
<field name="id" class="java.lang.String">
    <fieldDescription><![CDATA[/person/plan/levels/level/item/id]]></fieldDescription>
</field>
<field name="name" class="java.lang.String">
    <fieldDescription><![CDATA[/person/plan/levels/level/item/name]]></fieldDescription>
</field>
<field name="item2" class="java.lang.String">
    <fieldDescription><![CDATA[specialities/speciality/item]]></fieldDescription>
</field>
<field name="name2" class="java.lang.String">
    <fieldDescription><![CDATA[specialities/speciality/item/name]]></fieldDescription>
</field>
<group name="groupLevel">
    <groupExpression><![CDATA[$F{name}]]></groupExpression>
    <groupHeader>
        <band height="50">
            <textField isStretchWithOverflow="true" isBlankWhenNull="true">
                <reportElement x="0" y="0" width="100" height="20" uuid="64397dc7-2588-4642-8e52-dc8861242ac4"/>
                <textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
            </textField>
        </band>
    </groupHeader>
    <groupFooter>
        <band height="50"/>
    </groupFooter>
</group>
<background>
    <band splitType="Stretch"/>
</background>
<title>
    <band height="79" splitType="Stretch"/>
</title>
<pageHeader>
    <band height="35" splitType="Stretch"/>
</pageHeader>
<columnHeader>
    <band height="61" splitType="Stretch">
        <staticText>
            <reportElement x="100" y="0" width="100" height="20" uuid="935a54a5-d57d-4f6c-8dfb-93a0ec95ad01"/>
            <text><![CDATA[Speciality Name]]></text>
        </staticText>
    </band>
</columnHeader>
<detail>
    <band height="125" splitType="Stretch">
        <textField>
            <reportElement x="100" y="0" width="100" height="20" uuid="0b37e00b-b798-4795-bb62-f50c752fae59"/>
            <textFieldExpression><![CDATA[$F{name2}]]></textFieldExpression>
        </textField>
    </band>
</detail>
<columnFooter>
    <band height="45" splitType="Stretch"/>
</columnFooter>
<pageFooter>
    <band height="54" splitType="Stretch"/>
</pageFooter>
<summary>
    <band height="42" splitType="Stretch"/>
</summary>


有人能告诉我我做错了什么吗?提前谢谢。

我找到了答案,不确定这是否是最好的方法,但它对我很有效:

对于主报告,XPath应该是要用作组元素的参数的路径,按照所描述的场景,应该类似于:

<queryString language="XPath"> 
    <![CDATA[/person/plan/levels/level]]> 
</queryString> 

然后在“详细信息”栏中创建子报表,子报表应使用数据源表达式,其中使用第二组元素的路径,类似于:

<detail>
    <band height="18" splitType="Stretch">
        <subreport>
            <reportElement x="0" y="0" width="572" height="18" isRemoveLineWhenBlank="true" isPrintWhenDetailOverflows="true" uuid="64769eb9-baec-4995-a139-3a5f102f4764"/>
            <dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("/level/specialities/speciality")]]></dataSourceExpression>
            <subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "subReport.jasper"]]></subreportExpression>
        </subreport>
    </band>
</detail>

现在填充子报表,如果要对其上的更多元素进行分组,应该在要分组的元素中启动XPath,就像在主报表中一样。如果要创建第三个组,这应该可以工作,只需创建子报表并重复该过程


我希望这对其他人有所帮助,如果需要,我可以扩展解释,只需提问。

我找到了解决方案,您只能对一个元素进行分组,对于另一个元素,您必须使用子报表,XPath应该是要从中开始分组的父元素的路径。