Группировка XSLT по значению дочернего узла

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