| 類型 | 語法 | 示例 | 說明 |
|---|---|---|---|
| 絕對路徑 | /root/child | /NameList/Person | 從文檔根節點開始 |
| 相對路徑 | child | Name | 相對當前上下文節點 |
| 條件過濾 | [predicate] | /Person[Age<30] | 方括號內寫條件 |
| 位置索引 | [position()] | /Person[1] 或 [position()=1] | 1-based 索引 |
| 屬性選取 | @attr | /Person[@id='100'] | @ 符號選取屬性 |
| 函數 | count(), position() | count(/Person) | 統計節點數、位置判斷 |
| 邏輯運算 | and, or, =, < | [Gender='男' and Age>20] | 支援基本邏輯 |
<NameList>
<Person><Name>強尼</Name><Gender>男</Gender><Age>56</Age></Person>
<Person><Name>阿美</Name><Gender>女</Gender><Age>23</Age></Person>
<Person><Name>李麗</Name><Gender>女</Gender><Age>58</Age></Person>
<Person><Name>傑森</Name><Gender>男</Gender><Age>32</Age></Person>
<Person><Name>劉三</Name><Gender>男</Gender><Age>21</Age></Person>
</NameList>
// 1. 選取所有 Person 節點 (作為報表主查詢)
/NameList/Person
// 2. 相對路徑:在 Person 上下文中選取 Name
Name
// 3. 絕對路徑選取所有 Name
/NameList/Person/Name
// 4. 條件查詢:年齡 < 50 的 Person
/NameList/Person[Age < 50]
// 5. 條件查詢:性別為女的 Person
/NameList/Person[Gender = '女']
// 6. 第一條記錄
/NameList/Person[1]
// 7. 前兩條記錄
/NameList/Person[position() <= 2]
// 8. 統計 Person 總數
count(/NameList/Person)
Data → Connections / Data Sources → New → XML Data SourceData → Report Query) 設置 XPath 查詢語句 (如 /NameList/Person)((JRXmlDataSource)$P{REPORT_DATA_SOURCE}).dataSource("相對XPath")Add node as field,自動生成 $F{fieldName}
public void fillReport() throws JRException {
// 1. 數據源
JRXmlDataSource dataSource = new JRXmlDataSource(new File("NameList.xml"));
// 2. 參數
Map params = new HashMap<>();
// 3. 填充
JasperPrint print = JasperFillManager.fillReport("Report.jasper", params, dataSource);
// 4. 導出
JasperExportManager.exportReportToPdfFile(print, "output.pdf");
}
XPath 是 JasperReport 處理 XML 數據源的核心查詢語言。掌握絕對/相對路徑、條件謂詞、position()、count()等常用語法,配合 iReport 可視化字段映射,即可高效完成「XML → 報表」轉換。關鍵技巧:REPORT_COUNT 變量配合動態 XPath 實現子報表數據源精準定位。