#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, надеюсь, что пальцы дрожат. большое спасибо, вы оказали потрясающую помощь!