如何从父级';JasperReports报表项列表中的s同级元素(xml数据源)

如何从父级';JasperReports报表项列表中的s同级元素(xml数据源),xml,xpath,jasper-reports,Xml,Xpath,Jasper Reports,我想创建订单项目列表;对于每个项目,我想显示一个“项目ID”和“地址行”字段;前一个字段的数据来自项上的子元素,但后一个字段的数据必须使用项中引用的唯一id从项的父元素的同级获取 为了说明这个问题,我创建了一个简化的xml数据源和报告。xml数据定义如下: <data> <productorder> <item> <id>10001</id> <installationAddressId&g

我想创建订单项目列表;对于每个项目,我想显示一个“项目ID”和“地址行”字段;前一个字段的数据来自项上的子元素,但后一个字段的数据必须使用项中引用的唯一id从项的父元素的同级获取

为了说明这个问题,我创建了一个简化的xml数据源和报告。xml数据定义如下:

<data>
<productorder>
    <item>
        <id>10001</id>
        <installationAddressId>1</installationAddressId>
    </item>
    <item>
        <id>10002</id>
        <installationAddressId>3</installationAddressId>
    </item>
</productorder>
<address>
    <id>1</id>
    <addressLine>Street 1, 12345 Berlin Germany</addressLine>
</address>
<address>
    <id>2</id>
    <addressLine>Street 2, 12345 Berlin Germany</addressLine>
</address>
<address>
    <id>3</id>
    <addressLine>Street 3, 12345 Berlin Germany</addressLine>
</address>
</data>

10001
1.
10002
3.
1.
德国柏林12345街1号
2.
德国柏林12345街2号
3.
德国柏林12345街3号
简单(不正确)的报告是:

<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="SimpleOrderItemReport" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="0d316a3a-9d1c-4483-bf7d-d1bd9165e0cb">
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="SimpleOrderItemReportDataAdapter"/>
<subDataset name="OrderItemList" uuid="c1a7dc7b-2bc3-4f1f-bab9-ae6e3b207739">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="SimpleOrderItemReportDataAdapter"/>
    <queryString language="xPath">
        <![CDATA[/data/productorder/item]]>
    </queryString>
    <field name="id_1" class="java.lang.String">
        <fieldDescription><![CDATA[id]]></fieldDescription>
    </field>
    <field name="installationAddressId_1" class="java.lang.String">
        <fieldDescription><![CDATA[installationAddressId]]></fieldDescription>
    </field>
    <field name="addressLine" class="java.lang.String">
        <fieldDescription><![CDATA[../../address/addressLine]]></fieldDescription>
    </field>
</subDataset>
<queryString language="xPath">
    <![CDATA[/data]]>
</queryString>
<detail>
    <band height="125" splitType="Stretch">
        <componentElement>
            <reportElement x="124" y="19" width="390" height="30" uuid="84a1e8b2-13df-4391-9cdd-39a9d4d79434"/>
            <jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd">
                <datasetRun subDataset="OrderItemList" uuid="0d232993-a132-45ff-813c-d00d8a685d9e">
                    <dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("/data/productorder/item")]]></dataSourceExpression>
                </datasetRun>
                <jr:listContents height="30" width="390">
                    <textField>
                        <reportElement x="40" y="0" width="40" height="30" uuid="2b9a8530-32e3-4ecb-8dc4-3d8d9d30b191"/>
                        <textElement textAlignment="Left" verticalAlignment="Top"/>
                        <textFieldExpression><![CDATA[$F{id_1}]]></textFieldExpression>
                    </textField>
                    <textField>
                        <reportElement x="190" y="0" width="200" height="30" uuid="d570993d-201b-4a43-9147-73036dd0cf11"/>
                        <textElement textAlignment="Left" verticalAlignment="Top"/>
                        <textFieldExpression><![CDATA[$F{addressLine}]]></textFieldExpression>
                    </textField>
                    <staticText>
                        <reportElement x="0" y="0" width="40" height="30" uuid="b96b0be3-fa58-42f1-8270-004a08a7c3df"/>
                        <textElement verticalAlignment="Top"/>
                        <text><![CDATA[Item ID:]]></text>
                    </staticText>
                    <staticText>
                        <reportElement x="90" y="0" width="100" height="30" uuid="f85e298c-e3e0-42e3-bd0d-fc7c7808c2f1"/>
                        <textElement verticalAlignment="Top"/>
                        <text><![CDATA[Address Line:]]></text>
                    </staticText>
                </jr:listContents>
            </jr:list>
        </componentElement>
    </band>
</detail>
</jasperReport>

对于上面提供的xml数据,我希望在报告中看到以下两行:

  • 项目编号:10001地址行:德国柏林12345街1号
  • 项目编号:10002地址行:德国柏林12345第3街

  • 我似乎找不到能够实现这一目标的字段描述或xpath查询。有人知道如何得到我想要的结果吗?

    如果使用JasperReports和Xalan作为XPath执行器(这是默认配置,请参阅),则可以使用XSLT
    current
    函数引用当前节点

    在您的情况下,字段应如下所示:

    <field name="addressLine" class="java.lang.String">
        <fieldDescription><![CDATA[../../address[id = current()/installationAddressId]/addressLine]]></fieldDescription>
    </field>
    

    谢谢你,爸爸!你的描述正是我想要的!