сделать элемент записи уникальным по сравнению с другим XML-файлом - PullRequest
1 голос
/ 14 марта 2019

Учитывая два XML-файла, мне нужно сравнить, если комбинация TITLEID и ARTIST уникальна (это означает, что во втором файле не существует той же комбинации TITLEID, ARTIST, существующей в первом XML-файле)

<CATALOG>
        <RECORD ID="109">
           <TITLEID>54</TITLEID>
           <ARTIST>Bob Dylan</ARTIST>
           <COUNTRY>USA</COUNTRY>
           <COMPANY>Columbia</COMPANY>
           <PRICE>10.90</PRICE>
           <YEAR>1985</YEAR> </CD>
        </RECORD>
        <RECORD ID="187">
           <TITLEID>88</TITLEID>
           <ARTIST>Bonnie Tyler</ARTIST>
           <COUNTRY>UK</COUNTRY>
           <COMPANY>CBS Records</COMPANY>
           <PRICE>9.90</PRICE>
           <YEAR>1988</YEAR> </CD>
         </RECORD>
    </CATALOG>

    second xml:

<CATALOG>
    <RECORD ID="109">
       <TITLEID>54</TITLEID>
       <ARTIST>Bob Dylan</ARTIST>
       <COUNTRY>USA</COUNTRY>
       <COMPANY>Columbia</COMPANY>
       <PRICE>10.90</PRICE>
       <YEAR>1985</YEAR> </CD>
    </RECORD>
     <RECORD ID="187">
       <TITLEID>text ',.</TITLEID>
       <ARTIST>Bonnie Tyler</ARTIST>
       <COUNTRY>UK</COUNTRY>
       <COMPANY>CBS Records</COMPANY>
       <PRICE>9.90</PRICE>
       <YEAR>1988</YEAR> </CD>
     </RECORD>
</CATALOG>

Так что мне нужно сделать следующее, только для тех записей, которые имеют следующее условие: TITLEIDARTIST (из xml1) TITLEIDARTIST (из xml2)

мне нужно сделать комбинацию TITLEIDARTIST уникальной, в первом xml-файле добавить, например, цифру к TITLEID (убедившись, что добавление этой цифры не создаст новое число, которое создаст новую комбинацию, которая будет соответствовать второй xml).

ТАК что желаемый результат будет похож (мне нужно только изменить первый xml и оставить нетронутым второй):

<CATALOG>
        <RECORD ID="109">
           <TITLEID>540</TITLEID>
           <ARTIST>Bob Dylan</ARTIST>
           <COUNTRY>USA</COUNTRY>
           <COMPANY>Columbia</COMPANY>
           <PRICE>10.90</PRICE>
           <YEAR>1985</YEAR> </CD>
        </RECORD>
         <RECORD ID="187">
           <TITLEID>88</TITLEID>
           <ARTIST>Bonnie Tyler</ARTIST>
           <COUNTRY>UK</COUNTRY>
           <COMPANY>CBS Records</COMPANY>
           <PRICE>9.90</PRICE>
           <YEAR>1988</YEAR> </CD>
         </RECORD>
    </CATALOG>

Обратите внимание, что во втором XML-файле в TITLEID можно найти текст, а не только цифры.

1 Ответ

0 голосов
/ 15 марта 2019

С XSLT 3 вы можете использовать составной ключ для определения элементов, для которых есть дубликаты во вторичном документе, а затем сгенерировать новый идентификатор на основе generate-id():

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    expand-text="yes"
    version="3.0">

  <xsl:param name="doc2">
<CATALOG>
    <RECORD ID="109">
       <TITLEID>54</TITLEID>
       <ARTIST>Bob Dylan</ARTIST>
       <COUNTRY>USA</COUNTRY>
       <COMPANY>Columbia</COMPANY>
       <PRICE>10.90</PRICE>
       <YEAR>1985</YEAR>
    </RECORD>
     <RECORD ID="187">
       <TITLEID>text ',.</TITLEID>
       <ARTIST>Bonnie Tyler</ARTIST>
       <COUNTRY>UK</COUNTRY>
       <COMPANY>CBS Records</COMPANY>
       <PRICE>9.90</PRICE>
       <YEAR>1988</YEAR>
     </RECORD>
</CATALOG>      
  </xsl:param>

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:key name="ref" match="RECORD" composite="yes" use="TITLEID, ARTIST"/>

  <xsl:template match="RECORD[key('ref', (TITLEID, ARTIST), $doc2)]/TITLEID">
      <xsl:copy>{generate-id()}</xsl:copy>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / bnnZVZ / 0

Для компактности и автономности этот пример включает дополнительный документ, встроенный, но, конечно, вы можете использовать параметр для передачи документа извне или изменениякод для использования, например, <xsl:param name="doc2" select="doc($doc2-uri)"/> со вторым параметром для передачи URI / местоположения второго документа, например, <xsl:param name="doc2-uri" as="xs:string">second-doc.xml</xsl:param>.

...