создайте xslt, чтобы объединить повторяющиеся свойства термина, а затем удалить

#xslt #duplicates

#xslt #дубликаты

Вопрос:

прошу прощения, если на этот вопрос есть ответы в другом месте, я просмотрел связанные вопросы, но не смог понять, как они связаны с этим.

У меня есть файл, подобный этому:

 <?xml version="1.0" encoding="utf-8"?>
<Zthes>
  <term>
    <termId>1</termId>
    <termUpdate>Add</termUpdate>
    <termName>Science, Biological</termName>
    <termType>Nd</termType>
    <termStatus>Active</termStatus>
    <termApproval>Approved</termApproval>
    <termCreatedDate>20110414T07:23:26</termCreatedDate>
    <termCreatedBy>admin</termCreatedBy>
    <termModifiedDate>20110414T07:35:54</termModifiedDate>
    <termModifiedBy>admin</termModifiedBy>
      <termAttribute label="A-Z Entry"/>
    <relation>
      <relationType>USE</relationType>
      <termId>OMITERM9998</termId>
      <termName>Biological Sciences</termName>
    </relation>
  </term>
  <term>
    <termId>2</termId>
    <termUpdate>Add</termUpdate>
    <termName>Sciences, Biological</termName>
    <termType>Nd</termType>
    <termStatus>Active</termStatus>
    <termApproval>Approved</termApproval>
    <termCreatedDate>20110414T07:23:26</termCreatedDate>
    <termCreatedBy>admin</termCreatedBy>
    <termModifiedDate>20110414T07:35:54</termModifiedDate>
    <termModifiedBy>admin</termModifiedBy>
      <termAttribute label="A-Z Entry"/>
    <relation>
      <relationType>USE</relationType>
      <termId>OMITERMO9999</termId>
      <termName>Biological Sciences</termName>
    </relation>
  </term>
  <term>
    <termId>OMITERMO9998</termId>
    <termUpdate>Add</termUpdate>
    <termName>Biological Sciences</termName>
    <termType>Pt</termType>
    <termStatus>Active</termStatus>
    <termApproval>Approved</termApproval>
    <termCreatedDate>20110414T07:23:26</termCreatedDate>
    <termCreatedBy>admin</termCreatedBy>
    <termModifiedDate>20110414T07:35:54</termModifiedDate>
    <termModifiedBy>admin</termModifiedBy>
      <termAttribute label="A-Z Entry"/>
   </term>
  <term>
    <termId>OMITERMO9999</termId>
    <termUpdate>Add</termUpdate>
    <termName>Biological Sciences</termName>
    <termType>Pt</termType>
    <termStatus>Active</termStatus>
    <termApproval>Approved</termApproval>
    <termCreatedDate>20110414T07:23:26</termCreatedDate>
    <termCreatedBy>admin</termCreatedBy>
    <termModifiedDate>20110414T07:35:54</termModifiedDate>
    <termModifiedBy>admin</termModifiedBy>
      <termAttribute label="A-Z Entry"/>
   </term>
</Zthes>
  

Возможно ли написать xlst, который проходит через все Pts и объединяет их? Это привело бы к тому, что в данном случае были бы имена второго термина, использующие один и тот же термин Pt. Идентификатор, который они используют, не важен. Каждый Nd будет ссылаться на Pt, не у каждого Pt будут ссылки на него, и у Pts может быть несколько ссылок на них

Спасибо за любые указания, я безнадежен в этих вещах!

Редактировать: результат будет:

 <?xml version="1.0" encoding="utf-8"?>
<Zthes>
  <term>
    <termId>1</termId>
    <termUpdate>Add</termUpdate>
    <termName>Science, Biological</termName>
    <termType>Nd</termType>
    <termStatus>Active</termStatus>
    <termApproval>Approved</termApproval>
    <termCreatedDate>20110414T07:23:26</termCreatedDate>
    <termCreatedBy>admin</termCreatedBy>
    <termModifiedDate>20110414T07:35:54</termModifiedDate>
    <termModifiedBy>admin</termModifiedBy>
      <termAttribute label="A-Z Entry"/>
    <relation>
      <relationType>USE</relationType>
      <termId>OMITERM9998</termId>
      <termName>Biological Sciences</termName>
    </relation>
  </term>
  <term>
    <termId>2</termId>
    <termUpdate>Add</termUpdate>
    <termName>Sciences, Biological</termName>
    <termType>Nd</termType>
    <termStatus>Active</termStatus>
    <termApproval>Approved</termApproval>
    <termCreatedDate>20110414T07:23:26</termCreatedDate>
    <termCreatedBy>admin</termCreatedBy>
    <termModifiedDate>20110414T07:35:54</termModifiedDate>
    <termModifiedBy>admin</termModifiedBy>
      <termAttribute label="A-Z Entry"/>
    <relation>
      <relationType>USE</relationType>
      <termId>OMITERMO9998</termId>
      <termName>Biological Sciences</termName>
    </relation>
  </term>
  <term>
    <termId>OMITERMO9998</termId>
    <termUpdate>Add</termUpdate>
    <termName>Biological Sciences</termName>
    <termType>Pt</termType>
    <termStatus>Active</termStatus>
    <termApproval>Approved</termApproval>
    <termCreatedDate>20110414T07:23:26</termCreatedDate>
    <termCreatedBy>admin</termCreatedBy>
    <termModifiedDate>20110414T07:35:54</termModifiedDate>
    <termModifiedBy>admin</termModifiedBy>
      <termAttribute label="A-Z Entry"/>
   </term>
      </Zthes>
  

таким образом, связь, которую имели 2-е термины с 2-мя терминами Pt с одинаковым именем, но разными идентификаторами, были объединены в 2-е термины, имеющие связь только с одним термином Pt. До тех пор, пока связи были объединены в первый PT, второй PT можно было бы удалить, чтобы не было дубликатов, но отношения все равно были бы неповрежденными?

Комментарии:

1. Ваше объяснение мне непонятно. Точный желаемый результат для этого входного примера помог бы.

2. @Alrejandro надеюсь, редактирование исправит это, большое спасибо

3. Кенни, что идентифицирует term элементы с termType «Nd», которые вы хотите объединить? Это termName содержимое элемента?

4. Привет, Мартин, все верно, на Nds просто ссылается тот факт, что у них есть termtype nd. Они также будут иметь отношение к PT. Существует 2 разных типа терминов: предпочтительные и непривилегированные. Термины, не являющиеся предпочтительными, ссылаются на предпочтительный термин. Предпочтительными терминами являются Pts, а непривлекательными терминами являются Nds. Это Pts, которые нуждаются в объединении, не должно быть повторяющихся Nds.

Ответ №1:

Я написал следующую таблицу стилей:

 <xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

<xsl:key name="k1" match="term[termType = 'Pt']" use="termName"/>
<xsl:key name="k2" match="term[termType = 'Pt']" use="termId"/>

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="term[termType = 'Pt'][not(generate-id() = generate-id(key('k1', termName)[1]))]"/>

<xsl:template match="term[termType = 'Nd']/relation/termId">
  <xsl:copy>
    <xsl:value-of select="key('k1', key('k2', .)/termName)[1]/termId"/>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>
  

При применении к

 <?xml version="1.0" encoding="utf-8"?>
<Zthes>
  <term>
    <termId>1</termId>
    <termUpdate>Add</termUpdate>
    <termName>Science, Biological</termName>
    <termType>Nd</termType>
    <termStatus>Active</termStatus>
    <termApproval>Approved</termApproval>
    <termCreatedDate>20110414T07:23:26</termCreatedDate>
    <termCreatedBy>admin</termCreatedBy>
    <termModifiedDate>20110414T07:35:54</termModifiedDate>
    <termModifiedBy>admin</termModifiedBy>
      <termAttribute label="A-Z Entry"/>
    <relation>
      <relationType>USE</relationType>
      <termId>OMITERM9998</termId>
      <termName>Biological Sciences</termName>
    </relation>
  </term>
  <term>
    <termId>2</termId>
    <termUpdate>Add</termUpdate>
    <termName>Sciences, Biological</termName>
    <termType>Nd</termType>
    <termStatus>Active</termStatus>
    <termApproval>Approved</termApproval>
    <termCreatedDate>20110414T07:23:26</termCreatedDate>
    <termCreatedBy>admin</termCreatedBy>
    <termModifiedDate>20110414T07:35:54</termModifiedDate>
    <termModifiedBy>admin</termModifiedBy>
      <termAttribute label="A-Z Entry"/>
    <relation>
      <relationType>USE</relationType>
      <termId>OMITERMO9999</termId>
      <termName>Biological Sciences</termName>
    </relation>
  </term>
  <term>
    <termId>OMITERMO9998</termId>
    <termUpdate>Add</termUpdate>
    <termName>Biological Sciences</termName>
    <termType>Pt</termType>
    <termStatus>Active</termStatus>
    <termApproval>Approved</termApproval>
    <termCreatedDate>20110414T07:23:26</termCreatedDate>
    <termCreatedBy>admin</termCreatedBy>
    <termModifiedDate>20110414T07:35:54</termModifiedDate>
    <termModifiedBy>admin</termModifiedBy>
      <termAttribute label="A-Z Entry"/>
   </term>
  <term>
    <termId>OMITERMO9999</termId>
    <termUpdate>Add</termUpdate>
    <termName>Biological Sciences</termName>
    <termType>Pt</termType>
    <termStatus>Active</termStatus>
    <termApproval>Approved</termApproval>
    <termCreatedDate>20110414T07:23:26</termCreatedDate>
    <termCreatedBy>admin</termCreatedBy>
    <termModifiedDate>20110414T07:35:54</termModifiedDate>
    <termModifiedBy>admin</termModifiedBy>
      <termAttribute label="A-Z Entry"/>
   </term>
</Zthes>
  

результат таков

 <?xml version="1.0" encoding="utf-8"?><Zthes>
  <term>
    <termId>1</termId>
    <termUpdate>Add</termUpdate>
    <termName>Science, Biological</termName>
    <termType>Nd</termType>
    <termStatus>Active</termStatus>
    <termApproval>Approved</termApproval>
    <termCreatedDate>20110414T07:23:26</termCreatedDate>
    <termCreatedBy>admin</termCreatedBy>
    <termModifiedDate>20110414T07:35:54</termModifiedDate>
    <termModifiedBy>admin</termModifiedBy>
      <termAttribute label="A-Z Entry"/>
    <relation>
      <relationType>USE</relationType>
      <termId/>
      <termName>Biological Sciences</termName>
    </relation>
  </term>
  <term>
    <termId>2</termId>
    <termUpdate>Add</termUpdate>
    <termName>Sciences, Biological</termName>
    <termType>Nd</termType>
    <termStatus>Active</termStatus>
    <termApproval>Approved</termApproval>
    <termCreatedDate>20110414T07:23:26</termCreatedDate>
    <termCreatedBy>admin</termCreatedBy>
    <termModifiedDate>20110414T07:35:54</termModifiedDate>
    <termModifiedBy>admin</termModifiedBy>
      <termAttribute label="A-Z Entry"/>
    <relation>
      <relationType>USE</relationType>
      <termId>OMITERMO9998</termId>
      <termName>Biological Sciences</termName>
    </relation>
  </term>
  <term>
    <termId>OMITERMO9998</termId>
    <termUpdate>Add</termUpdate>
    <termName>Biological Sciences</termName>
    <termType>Pt</termType>
    <termStatus>Active</termStatus>
    <termApproval>Approved</termApproval>
    <termCreatedDate>20110414T07:23:26</termCreatedDate>
    <termCreatedBy>admin</termCreatedBy>
    <termModifiedDate>20110414T07:35:54</termModifiedDate>
    <termModifiedBy>admin</termModifiedBy>
      <termAttribute label="A-Z Entry"/>
   </term>

</Zthes>
  

итак, одна перекрестная ссылка разрешена неправильно, но я думаю, что проблема не в XSLT, а в ваших данных, которые у вас есть, <termId>OMITERM9998</termId> но затем <termId>OMITERMO9998</termId> с ведущей 0 . Это помогает? Находятся ли идентификаторы в реальных данных в лучшей форме? Или вам нужно каким-то образом закодировать удаление начальных нулей для сопоставления элементов / перекрестных ссылок?

Комментарии:

1. Всем привет, я запустил это на примере фрагмента кода, и да, это сработало отлично. Я не уверен, что там было с 0, надеюсь, что пальцы дрожат. большое спасибо, вы оказали потрясающую помощь!