免责声明:我仍在学习 XML/XSLT,因此如果这太简单的话请原谅。
我正在尝试在节点 A 中查找一个元素,将其与节点 B 中的类似元素匹配,并将从节点 B 的条目返回到节点 A。
即找到与EmployeeTimeValuationResult/bookingDate匹配的EmployeeTimeSheetEntry下的startDate,并返回相应的cust_Overtime_HR_Action元素:
我正在尝试使用一个密钥来生成查找(基于这个问题的答案:当在另一个节点中查找标记时,打印逗号分隔的标记),但我不清楚将apply-templates语句放在哪里并检索节点(我现在非常困惑,一直在兜圈子)。
示例源 XML:
<EmployeeTimeSheet>
<EmployeeTimeSheet>
<employeeTimeSheetEntry>
<EmployeeTimeSheetEntry>
<cust_Overtime_HR_ACTION>TOIL</cust_Overtime_HR_ACTION>
<startDate>2024-11-25T00:00:00.000</startDate>
</EmployeeTimeSheetEntry>
<EmployeeTimeSheetEntry>
<cust_Overtime_HR_ACTION>TOIL</cust_Overtime_HR_ACTION>
<startDate>2024-11-27T00:00:00.000</startDate>
</EmployeeTimeSheetEntry>
<EmployeeTimeSheetEntry>
<cust_Overtime_HR_ACTION>Payout</cust_Overtime_HR_ACTION>
<startDate>2024-11-30T00:00:00.000</startDate>
</EmployeeTimeSheetEntry>
</employeeTimeSheetEntry>
<employeeTimeValuationResult>
<EmployeeTimeValuationResult>
<bookingDate>2024-11-25T00:00:00.000</bookingDate>
</EmployeeTimeValuationResult>
</employeeTimeValuationResult>
</EmployeeTimeSheet>
这是我在 XSLT 中尝试(但失败了)做的事情:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<!-- generate lookup table - must be top level, i.e. before template match -->
<xsl:key name="timeSheetEntry" match="EmployeeTimeSheet/EmployeeTimeSheet/employeeTimeSheetEntry/EmployeeTimeSheetEntry" use="startDate"/>
<xsl:template match="/">
<EmployeeTimeSheet>
<!-- retrieve cust_Overtime_HR_ACTION where the bookingDate matches the startDate in above lookup -->
<xsl:template match="/">
<xsl:apply-templates select="key('timeSheetEntry', EmployeeTimeSheet/EmployeeTimeSheet/employeeTimeValuationResult/EmployeeTimeValuationResult/bookingDate)/cust_Overtime_HR_ACTION"/>
</xsl:template>
<xsl:for-each select="EmployeeTimeSheet/EmployeeTimeSheet">
<xsl:for-each select="employeeTimeValuationResult/EmployeeTimeValuationResult">
<xsl:variable name="var_TimeValResult" select="./*"></xsl:variable>
<EmployeeTimeSheet>
<xsl:copy-of select="$var_TimeValResult"/>
<xsl:template match="cust_Overtime_HR_ACTION">
<overtimeHRaction>
<xsl:value-of select="."/>
</overtimeHRaction>
</xsl:template>
</EmployeeTimeSheet>
</xsl:for-each>
</xsl:for-each> <!-- EmployeeTimeSheet/EmployeeTimeSheet -->
</EmployeeTimeSheet>
</xsl:template>
</xsl:样式表>
(对于初级水平的代码,深表歉意)
输出应如下所示,其中 2024-11-25 的元素cust_Overtime_HR_ACTION添加到EmployeeTimeValuationResult节点:
<EmployeeTimeSheet>
<EmployeeTimeSheet>
<employeeTimeValuationResult>
<EmployeeTimeValuationResult>
<bookingDate>2024-11-25T00:00:00.000</bookingDate>
<cust_Overtime_HR_ACTION>TOIL</cust_Overtime_HR_ACTION>
</EmployeeTimeValuationResult>
</employeeTimeValuationResult>
</EmployeeTimeSheet>
有人能告诉我哪里出错了吗?XSLT 测试工具只是说:
无法使用提供的 XML/XSL 输入生成 XML 文档。样式表编译期间报告了错误
我无法弄清楚检索相应节点所需的逻辑。
非常感谢您提供的任何指导。
谨致问候,AJ