#xml #xslt
Вопрос:
У меня есть xml — файл, содержащий участников курсов A и B. Все участники разбиты на группы. Группа 03 прошла курс уровня А.
<contacts>
<contact>
<informalname>Jan</informalname>
<formalname>met de Pet</formalname>
<cursus level="LevelA" group="03">
<coursetown>Amsterdam</coursetown>
<coursedate>4 and 11 March 2021</coursedate>
<coursename>Fantastic Course A</coursename>
</cursus>
<cursus level="LevelB" group="05">
<coursetown>Rotterdam</coursetown>
<coursedate>15 and 22 november 2021</coursedate>
<coursename>Fantastic Course Level B</coursename>
</cursus>
</contact>
<contact>
<informalname>Maria</informalname>
<formalname>Zusenzo</formalname>
<cursus level="LevelA" group="01">
<coursetown>Amsterdam</coursetown>
<coursedate>2 and 16 november 2020</coursedate>
<coursename>Fantastic Course A</coursename>
</cursus>
<cursus level="LevelB" group="05">
<coursetown>Rotterdam</coursetown>
<coursedate>15 and 22 november 2021</coursedate>
<coursename>Fantastic Course Level B</coursename>
</cursus>
</contact>
</contacts>
Я могу разделить xml-файл на вложенные файлы, с помощью которых я могу создавать списки посещаемости и сертификаты. Но результат все равно содержит информацию о других группах, в которых был участник.
Мое намерение состоит в том, чтобы разделить xml-файл на отдельные файлы по номеру группы, которые содержат информацию об участнике и только данные, относящиеся к курсам / курсу этой конкретной группы.
В случае группы «05» желаемый результат выглядит следующим образом:
<contacts>
<contact>
<informalname>Jan</informalname>
<formalname>met de Pet</formalname>
<cursus level="LevelB" group="05">
<coursetown>Rotterdam</coursetown>
<coursedate>15 and 22 november 2021</coursedate>
<coursename>Fantastic Course Level B</coursename>
</cursus>
</contact>
<contact>
<informalname>Maria</informalname>
<formalname>Zusenzo</formalname>
<cursus level="LevelB" group="05">
<coursetown>Rotterdam</coursetown>
<coursedate>15 and 22 november 2021</coursedate>
<coursename>Fantastic Course Level B</coursename>
</cursus>
</contact>
</contacts>
Теперь я использую следующий файл xslt:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="contacts">
<xsl:for-each-group select="contact" group-by="cursus/@group">
<xsl:result-document href="groep-{current-grouping-key()}.xml">
<contacts>
<xsl:apply-templates select="current-group()"/>
</contacts>
</xsl:result-document>
</xsl:for-each-group>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
Я попытался добавить второй шаблон с инструкциями типа <xsl:if test=»@group = текущий ключ группировки()»/>, но они не дали результата. Я надеюсь, что вы сможете мне помочь. Заранее спасибо.
Ответ №1:
Добавить
<xsl:template match="contact/cursus">
<xsl:if test="@group = current-grouping-key()">
<xsl:next-match/>
</xsl:if>
</xsl:template>
копировать только совпадающие cursus
элементы.
Комментарии:
1. Большое спасибо, это работает! — Я удалил: )]. Теперь это: <xsl:if test=»@groep = ключ текущей группировки()»>. Я никогда не слышал о следующем матче!