У меня есть XML-документ, полный кодов ICD10, отформатированных так:
<ICD10CM.index>
<version>2019</version>
<title>ICD-10-CM INDEX TO DISEASES and INJURIES</title>
<letter>
<title>A</title>
<mainTerm>
<title>Abnormal, abnormality, abnormalities</title>
<seeAlso>Anomaly</seeAlso>
<term level="1">
<title>chromosome, chromosomal</title>
<code>Q99.9</code>
<term level="2">
<title>with more than three X chromosomes, female</title>
<code>Q97.1</code>
</term>
<term level="2">
<title>analysis result</title>
<code>R89.8</code>
<term level="3">
<title>bronchial washings</title>
<code>R84.8</code>
</term>
<term level="3">
<title>cerebrospinal fluid</title>
<code>R83.8</code>
</term>
</term>
</term>
</mainTerm>
</letter>
</ICD10CM.index>
Я хотел бы в итоге свернуть список элементов, но каждый элемент в окончательном списке должен ссылаться на своих родителей, возможно, рекурсивно. Я бы хотел, чтобы результат выглядел примерно так:
<codes>
<code>
<id>Q99.9</id>
<description>Chromosome, chromosomal</description>
</code>
<code>
<id>Q97.1</id>
<description>Chromosome, chromosomal – with more than three X chromosomes, female</description>
</code>
<code>
<id>R89.8</id>
<description>Chromosome, chromosomal – analysis result</description>
</code>
<code>
<id>R84.8</id>
<description>Chromosome, chromosomal – analysis result – bronchial washings</description>
</code>
<code>
<id>R83.8</id>
<description>Chromosome, chromosomal – analysis result – cerebrospinal fluid</description>
</code>
</codes>
Я довольно новичок в XSLT и создал только несколько преобразований, поэтому огромные бонусные баллы за то, что я помог понять ответ, а не просто предоставил фрагмент кода, который выполняет эту работу.
Этот level="3"
пример является наиболее глубоко вложенным образцом, который я нашел при быстром поиске данных, но я бы предпочел пример, который подходит для любой глубины.
Редактировать: Поскольку люди спрашивали, я использую XSLT 2.0