如何使用 xslt 2.0 合并两个 xml 输入变量而不使用 for-each 循环

问题描述 投票:0回答:1

我们需要处理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 xslt-2.0
1个回答
0
投票

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>
© www.soinside.com 2019 - 2024. All rights reserved.