具有多个Condtions XSLT的键



我在XML中有两个键,其中一个密钥用于查找firstName,第二个键用于匹配姓氏。我的预期输出是,无论何时,我都会在多个承包商姓氏中名称中匹配员工的名称和最后一个名称,我需要检索承包商XML中存在的代理名称,并在员工中使用它

输入

   <listofdata>
    <data>
    <Type>Employee</Type>
    <firstname>x</firstname>
    <lastname>y</lastname>
    </data>
    <data>
    <Type>Contractor</Type>
    <firstname>x</firstname>
    <lastname>y</lastname>
    <agency>z</agency>
    </data>
    <data>
    <Type>Contractor</Type>
    <firstname>x</firstname>
    <lastname>x</lastname>
    <agency>a</agency>
    </data>
    <data>
    <Type>Contractor</Type>
    <firstname>a</firstname>
    <lastname>y</lastname>
    <agency>b</agency>
    </data>
    </listofdata>

输出

    <listofdata>
    <data>
    <Type>Employee</Type>
    <firstname>x</firstname>
    <lastname>y</lastname>
    <agency>z</agency>
    </data>
    <data>
    <Type>Contractor</Type>
    <firstname>x</firstname>
    <lastname>y</lastname>
    <agency>z</agency>
    </data>
    <data>
    <Type>Contractor</Type>
    <firstname>x</firstname>
    <lastname>x</lastname>
    <agency>a</agency>
    </data>
    <data>
    <Type>Contractor</Type>
    <firstname>a</firstname>
    <lastname>y</lastname>
    <agency>b</agency>
    </data>
    </listofdata>

XSLT:

<!--get the agency  -->
<xsl:template name="getagency">
  <xsl:variable name="match" select="key('firstname', firstname) 
 and key('lastname', lastname)" />
 <xsl:if test="$match">
                     <xsl:variable name="lastnamevar" select="
 [key('lastname', lastname)] [key('fistname', firstname)]/agency" />
     <agency>
        <xsl:value-of select="$lastnamevar" />
     </agency>
   </xsl:if>
 </xsl:template>

每当我遇到"员工"来获取代理时,我都会打电话给模板,而我的名字和最后一个名称是查找承包商中的名称和姓氏的钥匙。问题可以在上面的if上获得布尔值true false,但无法获得确切的代理价值,无法告诉XSLT,该XSLT将代理商带到了FirstName和LastName匹配的代理,如果我使用单键,则轴有效,但不确定如何使其适用于2个键

以及@martinhonnen提出的解决方案,可以采取两组由不同键找到的值,并形成其相交。在XSLT 2.0中,您可以直接使用intersect操作员进行操作:

key('firstName', 'John') intersect key('lastName', 'Smith')

xpath 1.0没有设置交叉点的操作员,但是基于集合的解决方案:

<xsl:variable name="X" select="key('firstName', 'John')"/>
<xsl:variable name="Y" select="key('lastName', 'Smith')"/>
... select="$X[count(.|$Y) = count($Y)]"/>

我认为您想要一个复合键,因此在XSLT 3中使用Saxon 9.8(任何版本)或Altova 2017或2018您可以直接使用

<xsl:key name="contract" match="data[Type = 'Contractor']" composite="yes" use="firstname, lastname"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="data[Type = 'Employee' and key('contract', (firstname, lastname))]/node()[last()]">
    <xsl:next-match/>
    <xsl:copy-of select="key('contract', ../(firstname, lastname))/agency"/>
</xsl:template>

在XSLT 2中,您可以将密钥中的两个元素值与例如<xsl:key name="contract" match="data[Type = 'Contractor']" use="concat(firstname, '|', lastname)"/>并使用例如

<xsl:template match="data[Type = 'Employee' and key('contract', concat(firstname, '|', lastname))]/node()[last()]">
    <xsl:next-match/>
    <xsl:copy-of select="key('contract', concat(../firstname, '|', ../lastname))/agency"/>
</xsl:template>

当然,您必须拼写身份转换模板。

相关内容

  • 没有找到相关文章

最新更新