Групповые данные для адаптера данных XML

Мне нужна помощь с JasperReports. Я пытаюсь создать отчет из XML-файла в качестве адаптера данных, список имеющихся у меня элементов выглядит так:

Уровень: уровни с 6 по 5 -Специализация: Нет специальности Уровень: уровни с 5 по 4 -Специализация: Нет специальности Уровень: уровень-тест-первый -Специализация: Специальность Test-t -Специализация: Специальность Test-t2

Я тоже хочу напечатать это так, но в отчете печатается только первый уровень с первой специальностью каждого уровня, примерно так:

Уровень: уровни с 6 по 5 -Специализация: Нет специальности -Специальность: Нет специальности -Специализация: Специальность Test-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>

Это мой отчет:

<?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 должен быть путем к родительскому элементу, с которого вы хотите начать группу.

Angel Aguilar 10.04.2018 22:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
232
1

Ответы 1

Я нашел ответ, не уверен, что это лучший способ сделать это, но у меня он сработал:

Для основного отчета 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 в элементе, который хотите сгруппировать, как в основном отчете, это должно сработать, если вы также хотите создать третью группу, вам просто нужно создать подотчет и повторить процесс.

Надеюсь, это кому-то поможет, при необходимости могу расширить объяснение, просто спросите.

Другие вопросы по теме