我需要从具有一对多关系的 XML数据源中使用 iReport 编写报告。
我的主表是用户列表,此表中的每一行都映射到角色表中的许多行。当我将信息作为XML文档获取时,它具有以下结构:
<results>
<user>
<name>John Smith</name>
<id>12345</id>
<roles>
<role>
<name>Reports on Self</name>
<id>50</id>
</role>
<role>
<name>Reports on Others</name>
<id>51</id>
</role>
</roles>
</user>
<user>
<name>Jane Doe</name>
<id>54321</id>
<roles>
<role>
<name>Reports on Any</name>
<id>53</id>
</role>
<role>
<name>Changes to Any</name>
<id>63</id>
</role>
</roles>
</user>
</results>
我需要的是结果显示如此。我已经找到了有关如何使用子查询执行类似操作的信息,但我没有直接连接到数据库。我需要从XML文档中运行报告。
List of Users:
12345 John Smith
Roles:
Reports on Self
Reports on Others
54321 Jane Doe
Roles:
Reports on Any
Changes to Any
如果您对如何实现这一目标有任何想法,请告诉我。
答案 0 :(得分:0)
不幸的是,你不能用XPath做你的要求,因为它只对查询XML中的元素有用。但是像XSLT这样的东西,这是可能的。
使用上面的文件,使用下面的XSLT ......
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:text>List of Users:
</xsl:text>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="user">
<xsl:value-of select="id"/>
<xsl:text> </xsl:text>
<xsl:value-of select="name"/>
<xsl:text>
</xsl:text>
<xsl:apply-templates select="roles"/>
</xsl:template>
<xsl:template match="roles">
<xsl:text> Roles:
</xsl:text>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="role">
<xsl:text> </xsl:text>
<xsl:value-of select="name"/>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
...你得到以下输出:
List of Users:
12345 John Smith
Roles:
Reports on Self
Reports on Others
54321 Jane Doe
Roles:
Reports on Any
Changes to Any