XSLT 不同节点

XSLT distinct node

设置 1:

<?xml version='1.0' encoding='UTF-8'?>
<aa:Details xmlns:aa="urn:com.report">
   <aa:Row>
      <aa:Place>AAA</aa:Place>
      <aa:PlaceID>A123</aa:PlaceID>
   </aa:Row>
   <aa:Row>
      <aa:Place>BBB</aa:Place>
      <aa:PlaceID>B123</aa:PlaceID>
   </aa:Row>
   <aa:Row>
      <aa:Place>CCC</aa:Place>
      <aa:PlaceID>C123</aa:PlaceID>
   </aa:Row>
</aa:Details>

设置2

<?xml version='1.0' encoding='UTF-8'?>
<aa:Details xmlns:aa="urn:com.report">
    <aa:Row>
        <aa:Place>AAA</aa:Place>
        <aa:PlaceID>A123</aa:PlaceID>
    </aa:Row>
    <aa:Row>
        <aa:Place>EEE</aa:Place>
        <aa:PlaceID>E123</aa:PlaceID>
    </aa:Row>
    <aa:Row>
        <aa:Place>FFF</aa:Place>
        <aa:PlaceID>F123</aa:PlaceID>
    </aa:Row>
</aa:Details>

我上面有两组来自不同来源的数据。

我将如下合并两组数据

<?xml version='1.0' encoding='UTF-8'?>
<aa:Details xmlns:aa="urn:com.report">
   <aa:Row>
      <aa:Place>AAA</aa:Place>
      <aa:PlaceID>A123</aa:PlaceID>
   </aa:Row>
   <aa:Row>
      <aa:Place>BBB</aa:Place>
      <aa:PlaceID>B123</aa:PlaceID>
   </aa:Row>
   <aa:Row>
      <aa:Place>CCC</aa:Place>
      <aa:PlaceID>C123</aa:PlaceID>
   </aa:Row>
   <aa:Row>
      <aa:Place>AAA</aa:Place>
      <aa:PlaceID>A123</aa:PlaceID>
   </aa:Row>
   <aa:Row>
      <aa:Place>EEE</aa:Place>
      <aa:PlaceID>E123</aa:PlaceID>
   </aa:Row>
   <aa:Row>
      <aa:Place>FFF</aa:Place>
      <aa:PlaceID>F123</aa:PlaceID>
   </aa:Row>
</aa:Details>

我想根据以下条件转换并获得低于预期的输出

当第 2 组的 PlaceID 值等于第 1 组

时,通过移除任何节点,输出结果应来自第 2 组

期望输出

<?xml version="1.0" encoding="UTF-8"?>
<aa:Details xmlns:aa="urn:com.report">
   <aa:Row>
      <aa:Place>EEE</aa:Place>
      <aa:PlaceID>E123</aa:PlaceID>
   </aa:Row>
   <aa:Row>
      <aa:Place>FFF</aa:Place>
      <aa:PlaceID>F123</aa:PlaceID>
   </aa:Row>
</aa:Details>

我试过下面的 XSLT 代码,但它只删除了重复项

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:aa="urn:com.report">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="aa:Row[aa:PlaceID = following::aa:Row/aa:PlaceID]"/>  
</xsl:stylesheet>

如果转换的输入是您问题中显示的组合数据集,那么所述任务是不可能完成的,因为处理器无法知道哪些节点来自哪个集合。

定义一个键

<xsl:key name="placeKey" match="aa:Row" use="aa:Place">

将第二个输入文档作为主要输入,select将文档 1 作为

<xsl:variable name="doc1" select="document('input1.xml')">

然后将 document2 处理为

<xsl:template match="/">
  <aa:Details xmlns:aa="urn:com.report">
    <xsl:copy-of select="aa:Row[exists(key('placeKey', ., $doc1)]"/>
  </aa:Details>
</xsl:template>

这就是 XSLT 2.0。如果您仍在使用 XSLT 1.0 处理器,那么像往常一样,您将不得不再跳过几个环节。自从我使用 XSLT 1.0 以来已经有很长一段时间了,但我认为您必须将 copy-of 替换为

之类的东西
<xsl:for-each select="aa:Row">
  <xsl:variable name="row" select="."/>
  <xsl:for-each select="$doc1">
    <xsl:if test="key('placeKey', $row/Place)">
      <xsl:copy-of select="$row"/>
    </xsl:if>
  </xsl:for-each>
</xsl:for-each>