XSLT: разделение xml-файла на основе атрибута

#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 = ключ текущей группировки()»>. Я никогда не слышал о следующем матче!