我们需要处理InputVar1中的每个
employeeNumber
,从InputVar2中获取相应的部门值,并将以下输出格式映射显示到OuputVar。我们不需要显示 InputVar1 中不存在的员工记录。
我们应该使用xslt2.0而不使用for-each循环
InputVar1.xml
<Employees>
<List>
<emplyeeNumber>123</employeeNumber>
<employeeName>abc</emploeeName>
</List>
<List>
<emplyeeNumber>453</employeeNumber>
<employeeName>cde</emploeeName>
</List>
<List>
<emplyeeNumber>678</employeeNumber>
<employeeName>efg</emploeeName>
</List>
</Employees>
InputVar2.xml
<Departs>
<List>
<emplyeeNumber>123</employeeNumber>
<departName>fin</departName>
<departId>10</departId>
</List>
<List>
<emplyeeNumber>919</employeeNumber>
<departName>adm</departName>
<departId>20</departId>
</List>
<List>
<emplyeeNumber>453</employeeNumber>
<departName>hr</departName>
<departId>30</departId>
</List>
</Departs>
输出变量:
<WriteFile>
<LinesRecordSet>
<LinesRecord>
<emplyeeNumber>123</employeeNumber>
<departName>fin</departName>
<departId>10</departId>
<employeeName>abc</emploeeName>
</LinesRecord>
<LinesRecord>
<emplyeeNumber>453</employeeNumber>
<departName>hr</departName>
<departId>30</departId>
<employeeName>cde</emploeeName>
</LinesRecord>
<LinesRecord>
<emplyeeNumber>678</employeeNumber>
<departName></departName>
<departId></departId>
<employeeName>efg</emploeeName>
</LinesRecord>
</LinesRecordSet>
<WriteFile>
XSLT 有一个内置的 key 机制来解决交叉引用。在你的例子中,你可以这样做:
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="dept" match="List" use="employeeNumber" />
<xsl:param name="dept-doc">path/to/InputVar2.xml</xsl:param>
<xsl:template match="/Employees">
<WriteFile>
<LinesRecordSet>
<xsl:for-each select="List">
<LinesRecord>
<xsl:copy-of select="employeeNumber"/>
<xsl:copy-of select="key('dept', employeeNumber, document($dept-doc))/(departName, departId)"/>
<xsl:copy-of select="employeeName"/>
</LinesRecord>
</xsl:for-each>
</LinesRecordSet>
</WriteFile>
</xsl:template>
</xsl:stylesheet>