Как найти несопоставленные строки с XSLT - PullRequest
0 голосов
/ 06 октября 2019

У меня есть два больших файла xml, один из которых имеет следующий формат:

<Persons>
<Person>
<ID>1</ID>
<LAST_NAME>London</LAST_NAME>
</Person>
<Person>
<ID>2</ID>
<LAST_NAME>Twain</LAST_NAME>
</Person>
<Person>
<ID>3</ID>
<LAST_NAME>Dikkens</LAST_NAME>
</Person>
</Persons>

Второй файл имеет следующий формат:

<SalesPersons>
<SalesPerson>
<ID>2</ID>
<LAST_NAME>London</LAST_NAME>
</SalesPerson>
<SalesPerson>
<ID>3</ID>
<LAST_NAME>Dikkens</LAST_NAME>
</SalesPerson>
</SalesPersons>

Мне нужно найти эти записииз файла 1, которого нет в файле 2. Хотя я сделал это, используя цикл for-each, такой подход занимает значительное количество времени. Можно ли как-то заставить его работать быстрее, используя другой подход?

1 Ответ

0 голосов
/ 06 октября 2019

Использование ключа может помочь повысить производительность при поиске:

  <xsl:key name="sales-person" match="SalesPerson" use="concat(ID, '|', LAST_NAME)"/>

  <xsl:template match="/">
      <xsl:for-each select="Persons/Person">
          <xsl:variable name="person" select="."/>
          <!-- need to change context document for key function use -->
          <xsl:for-each select="$doc2">
              <xsl:if test="not(key('sales-person', concat($person/ID, '|', $person/LAST_NAME)))">
                  <xsl:copy-of select="$person"/>
              </xsl:if>
          </xsl:for-each>
      </xsl:for-each>
  </xsl:template>

Предполагается, что вы связали doc2 в качестве переменной или параметра, например, <xsl:param name="doc2" select="document('sales-persons.xml')"/>.

...