#xslt #key #grouping #muenchian-grouping
#xslt #Клавиша #группировка #muenchian-группировка
Вопрос:
В следующем примере XML-файлы должны быть сгруппированы в «Число» -значение узла. Я уже пробовал группировать метод Мюнх, но пока не смог его выполнить. Значение XSLT должно быть в 1.0. Для каждого числового узла должно быть создано поле, и каждое значение должно быть сгруппировано в него. Проблемы также возможны с несколькими значениями в узле, они должны отображаться отдельно. Спасибо за любую помощь, которую вы мне оказываете в этом!
<ROOT>
<PROC>
<DATA>
<Number>002</Number>
<Registration>27754</Registration>
<Country>Finland</Country>
<DATA>
<PROC>
<PROC>
<DATA>
<Number>003</Number>
<Registration>42852</Registration>
<Country>Sweden</Country>
<DATA>
<PROC>
<PROC>
<DATA>
<Number>003</Number>
<Registration>H/11/019|H/11/020|H/11/021</Registration>
<Country>Slovenia</Country>
<DATA>
<PROC>
<PROC>
<DATA>
<Number>002</Number>
<Registration>19481</Registration>
<Country>Denmark</Country>
<DATA>
<PROC>
<PROC>
<DATA>
<Number>004</Number>
<Registration>09-23</Registration>
<Country>Norway</Country>
<DATA>
<PROC>
</ROOT>
Приведенный выше код должен быть показан следующим образом:
<main>
<rbox>
<vNumber>002</vNumber>
<bbox>
<State>Finland</State>
<gbox>
<Registrations>
<Registration>27754</Registration>
</Registrations>
</gbox>
</bbox>
<bbox>
<State>Denmark</State>
<gbox>
<Registrations>
<Registration>19481</Registration>
</Registrations>
</gbox>
</bbox>
</rbox>
<rbox>
<vNumber>003</vNumber>
<bbox>
<State>Slovenia</State>
<gbox>
<Registrations>
<Registration>H/11/019</Registration>
</Registrations>
<Registrations>
<Registration>H/11/020</Registration>
</Registrations>
<Registrations>
<Registration>H/11/021</Registration>
</Registrations>
</gbox>
</bbox>
<bbox>
<State>Sweden</State>
<gbox>
<Registrations>
<Registration>42852</Registration>
</Registrations>
</gbox>
</bbox>
</rbox>
...
</main>
благодарим вас за быстрый ответ. Вот мой код на данный момент. Мне не удалось получить данные о стране и регистрации для сортировки в записи номера без создания нескольких значений. Я также пытался объединить значения в ключе «использовать», но это также не работает.
<xsl:key name="country" match="ROOT/PROC/DATA" use="Country"/>
<xsl:key name="registration" match="ROOT/PROC/DATA" use="Registration"/>
<xsl:template match="/">
<main>
<xsl:for-each select="//Number[not(.=preceding::*)]">
<rbox>
<xsl:element name="vNumber">
<vNumber><xsl:value-of select="."/></vNumber>
<xsl:for-each select="//DATA[generate-id() = generate-id(key('country', Country)[1])]">
<bbox>
<State><xsl:value-of select="Country"/></State>
<gbox>
<xsl:for-each select="//DATA[generate-id() = generate-id(key('registration', Registration)[1])]">
<Registrations>
<Registration><xsl:value-of select="Registration"/></Registration>
</Registrations>
</xsl:for-each>
</gbox>
</bbox>
</xsl:for-each>
</xsl:element>
</rbox>
</xsl:for-each>
</main>
</xsl:template>
**** РЕДАКТИРОВАТЬ: заполните таблицу стилей после справки от michael.hor257k относительно проблемы группировки —> Соответствующие продукты
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/"
xmlns:maa="http://www.oma.trp/maa/"
xmlns:rdm="http://www.oma.trp/dictionary/"
xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:param name="ns-prefix" select="'xfa'"/>
<xsl:param name="ns-namespace" select="'http://www.xfa.org/schema/xfa-data/1.0/'"/>
<xsl:param name="ns-prefix1" select="'maa'"/>
<xsl:param name="ns-namespace1" select="'http://www.oma.trp/maa/'"/>
<xsl:param name="ns-prefix2" select="'rdm'"/>
<xsl:param name="ns-namespace2" select="'http://www.oma.trp/dictionary/'"/>
<xsl:param name="ns-prefix3" select="'xsi'"/>
<xsl:param name="ns-namespace3" select="'http://www.w3.org/2001/XMLSchemainstance'"/>
<xsl:param name="ns-prefix4" select="'schemaLocation'"/>
<xsl:param name="ns-namespace4" select="'http://www.oma.trp/maa/variations.xsd'"/>
<xsl:param name="ns-schema" select="'http://www.oma.trp/maa/variations.xsd'"/>
<xsl:variable name="vRdm" select="document('')/*/namespace::*[name()='rdm']"/>
<xsl:variable name="vXsi" select="document('')/*/namespace::*[name()='xsi']"/>
<xsl:variable name="vSchemaLocation" select="document('')/*/namespace::*[name()='schemaLocation']"/>
<xsl:template match="/">
<xsl:element name="{$ns-prefix}:data" namespace="{$ns-namespace}">
<xsl:element name="{$ns-prefix1}:eu_application_form" namespace="{$ns-namespace1}">
<xsl:copy-of select="$vRdm"/>
<xsl:copy-of select="$vXsi"/>
<xsl:copy-of select="$vSchemaLocation"/>
<xsl:attribute name="xsi:schemaLocation">
<xsl:value-of select="$ns-schema" />
</xsl:attribute>
<xsl:template match="/">
<maa:variations-form>
<xsl:element name="{$ns-prefix1}:applicationInformation">
<xsl:element name="{$ns-prefix1}:human">1</xsl:element>
<xsl:element name="{$ns-prefix1}:veterinary">0</xsl:element>
<xsl:element name="{$ns-prefix1}:nationalAuthInMRP">1</xsl:element>
<xsl:element name="{$ns-prefix1}:euAuthorisation">0</xsl:element>
<xsl:element name="{$ns-prefix1}:nationalAuthorisation">0</xsl:element>
<xsl:element name="{$ns-prefix1}:procedureNumbers">
<xsl:element name="{$ns-prefix1}:procedureNumber"></xsl:element>
</xsl:element>
<!--RMS country Loop start -->
<xsl:template match="/">
<xsl:element name="{$ns-prefix1}:referenceMemberState">
<xsl:choose>
<xsl:when test="ROOT/PROC/DATA/Procedure_Number[contains(text(),'DK')]">
<xsl:text>Denmark</xsl:text>
</xsl:when>
<xsl:when test="ROOT/PROC/DATA/Procedure_Number[contains(text(),'SI')]">
<xsl:text>Slovenia</xsl:text>
</xsl:when>
</xsl:choose>
</xsl:element>
</xsl:template>
<!--RMS country Loop end -->
<!--CMS country Loop start -->
<xsl:template match="/">
<xsl:for-each select="//Country_Name[not(.=preceding::*)]">
<maa:concernedMemberStates>
<maa:concernedMemberState><xsl:value-of select="."/></maa:concernedMemberState>
</maa:concernedMemberStates>
</xsl:for-each>
</xsl:template>
<!--CMS country Loop end -->
<!--CONCERNED PRODUCTS -->
</xsl:element>
<xsl:template match="/">
<main>
<products>
<maa:formAndStrengthFlag>0</maa:formAndStrengthFlag>
<maa:footnote/>
<!--CONCERNED PRODUCTS -->
<xsl:key name="strength" match="ROOT/PROC/DATA" use="Speciality_Number"/>
<xsl:for-each select="ROOT/PROC/DATA[generate-id() = generate-id(key('strength', Speciality_Number)[1])]">
<redbox>
<variationNumber><xsl:value-of select="Speciality_Number"/></variationNumber>
<!-- for each member of the current group -->
<xsl:for-each select="key('strength', Speciality_Number)">
<blueBox>
<memberState><xsl:value-of select="Country_Name"/></memberState>
<greenBox>
<maNumbers>
<maNumber><xsl:value-of select="Registration_Number"/></maNumber>
</maNumbers>
</greenBox>
</blueBox>
</xsl:for-each>
</redbox>
</xsl:for-each>
</products>
</main>
</xsl:template>
</maa:variations-form>
</xsl:template>
</xsl:element>
<xsl:element name="FSTEMPLATE_">/Applications/eAFForms/1.20/Forms/Variation/Form/variation.xdp
</xsl:element>
<xsl:element name="FSFORMQUERY_">/Applications/eAFForms/1.20/Forms/Variation/Form/variation.xdp
</xsl:element>
<xsl:element name="FSTRANSFORMATIONID_">PDFForm</xsl:element>
<xsl:element name="FSTARGETURL_"/>
<xsl:element name="FSAWR_"/>
<xsl:element name="FSWR_"/>
<xsl:element name="FSCRURI_">repository://</xsl:element>
<xsl:element name="FSBASEURL_"/>
</xsl:element>
</xsl:template>
Комментарии:
1. Пожалуйста, опубликуйте свою попытку, чтобы мы могли ее исправить, вместо того, чтобы писать код для вас с нуля.
Ответ №1:
Если вы хотите сгруппировать DATA
элементы по Number
, вам нужно сопоставить DATA
и использовать ваш ключ Number
.
Попробуйте следующую таблицу стилей:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:key name="grp" match="DATA" use="Number"/>
<xsl:template match="/ROOT">
<main>
<!-- create a group for each distinct Number -->
<xsl:for-each select="PROC/DATA[generate-id() = generate-id(key('grp', Number)[1])]">
<rbox>
<vNumber>
<xsl:value-of select="Number"/>
</vNumber>
<!-- for each member of the current group -->
<xsl:for-each select="key('grp', Number)">
<bbox>
<State>
<xsl:value-of select="Country"/>
</State>
<gbox>
<Registrations>
<xsl:copy-of select="Registration"/>
</Registrations>
</gbox>
</bbox>
</xsl:for-each>
</rbox>
</xsl:for-each>
</main>
</xsl:template>
</xsl:stylesheet>
Ваш ввод не является правильно сформированным XML, но когда приведенная выше таблица стилей применяется к следующему вводу:
XML
<ROOT>
<PROC>
<DATA>
<Number>002</Number>
<Registration>27754</Registration>
<Country>Finland</Country>
</DATA>
</PROC>
<PROC>
<DATA>
<Number>003</Number>
<Registration>42852</Registration>
<Country>Sweden</Country>
</DATA>
</PROC>
<PROC>
<DATA>
<Number>003</Number>
<Registration>H/11/019|H/11/020|H/11/021</Registration>
<Country>Slovenia</Country>
</DATA>
</PROC>
<PROC>
<DATA>
<Number>002</Number>
<Registration>19481</Registration>
<Country>Denmark</Country>
</DATA>
</PROC>
<PROC>
<DATA>
<Number>004</Number>
<Registration>09-23</Registration>
<Country>Norway</Country>
</DATA>
</PROC>
</ROOT>
результатом будет:
<?xml version="1.0" encoding="UTF-8"?>
<main>
<rbox>
<vNumber>002</vNumber>
<bbox>
<State>Finland</State>
<gbox>
<Registrations>
<Registration>27754</Registration>
</Registrations>
</gbox>
</bbox>
<bbox>
<State>Denmark</State>
<gbox>
<Registrations>
<Registration>19481</Registration>
</Registrations>
</gbox>
</bbox>
</rbox>
<rbox>
<vNumber>003</vNumber>
<bbox>
<State>Sweden</State>
<gbox>
<Registrations>
<Registration>42852</Registration>
</Registrations>
</gbox>
</bbox>
<bbox>
<State>Slovenia</State>
<gbox>
<Registrations>
<Registration>H/11/019|H/11/020|H/11/021</Registration>
</Registrations>
</gbox>
</bbox>
</rbox>
<rbox>
<vNumber>004</vNumber>
<bbox>
<State>Norway</State>
<gbox>
<Registrations>
<Registration>09-23</Registration>
</Registrations>
</gbox>
</bbox>
</rbox>
</main>
Комментарии:
1. Спасибо, Майкл, это сработало! Однако сейчас я сталкиваюсь с новой проблемой: эта часть выше вложена в шаблон match=»/», и эта часть просто игнорируется во время преобразования. Могу ли я разместить полную таблицу стилей ниже или мне следует открыть новый вопрос?
2. Зачем вам нужно вкладывать это в другой шаблон? Приведенная выше полная таблица стилей; что еще вы пытаетесь выполнить?
3. Я отредактировал свой первый ответ с помощью моей пока полной таблицы стилей, внутри вложенной — ваша решаемая проблема, касающаяся группировки соответствующих продуктов. Проблема теперь, я думаю, в том, что теперь существует конфликт для правил шаблона, игнорируя цикл «Заинтересованный продукт» (ваше решение).
4. Ваша таблица стилей не имеет смысла, учитывая заданный ввод и ожидаемый результат. Я предлагаю вам опубликовать новый вопрос.