2009-06-29 8 views
2

Je suis nouveau en XML, désolé pour la question stupide. J'essaye de créer le modèle de xsl pour convertir le xml de source en destination. En fait c'est presque fini mais je ne sais pas comment énumérer correctement <creator> (créateur @ affil dans Destination xml).Comment énumérer les éléments indexés (xsl: key)?

Source:

<?xml version="1.0" encoding="iso-8859-1"?> 
<CREATORS> 
    <PERSON ROLE="CONTACT"> 
    <PREFIX>Prof</PREFIX> 
    <FIRST_NAME>Mike</FIRST_NAME> 
    <MIDDLE_INITIALS>J</MIDDLE_INITIALS> 
    <LAST_NAME>Petrov</LAST_NAME> 
    <SUFFIX/> 
    <POSITION>Director</POSITION> 
    <EMAIL_1>[email protected]</EMAIL_1> 
    <EMAIL_2>[email protected]</EMAIL_2> 
    <URL>www.pontorez.ru</URL> 
    <MOBILE_PHONE/> 
    <ADDRESS> 
     <DEPARTMENT/> 
     <ORGANISATION>Example</ORGANISATION> 
     <ADDRESS_1>Finch Pavilion</ADDRESS_1> 
     <ADDRESS_2>Middle Way</ADDRESS_2> 
     <CITY>Oxford</CITY> 
     <ZIP>OX9 7LG</ZIP> 
     <REGION/> 
     <COUNTRY CODE="GB">UK</COUNTRY> 
     <PHONE_1>+380 6245 716300</PHONE_1> 
     <PHONE_2/> 
     <FAX_1>+380 6245 716311</FAX_1> 
     <FAX_2/> 
    </ADDRESS> 
    <FOOTNOTE/> 
    </PERSON> 
    <PERSON ID="7091" ROLE="AUTHOR"> 
    <PREFIX>Prof</PREFIX> 
    <FIRST_NAME>Mike</FIRST_NAME> 
    <MIDDLE_INITIALS>J</MIDDLE_INITIALS> 
    <LAST_NAME>Petrov</LAST_NAME> 
    <SUFFIX/> 
    <POSITION>Director</POSITION> 
    <EMAIL_1>[email protected]</EMAIL_1> 
    <EMAIL_2>[email protected]</EMAIL_2> 
    <URL>www.pontorez.ru</URL> 
    <MOBILE_PHONE/> 
    <ADDRESS> 
     <DEPARTMENT/> 
     <ORGANISATION>Example</ORGANISATION> 
     <ADDRESS_1>Finch Pavilion</ADDRESS_1> 
     <ADDRESS_2>Middle Way</ADDRESS_2> 
     <CITY>Oxford</CITY> 
     <ZIP>OX9 7LG</ZIP> 
     <REGION/> 
     <COUNTRY CODE="GB">UK</COUNTRY> 
     <PHONE_1>+380 6245 716300</PHONE_1> 
     <PHONE_2/> 
     <FAX_1>+380 6245 716311</FAX_1> 
     <FAX_2/> 
    </ADDRESS> 
    <FOOTNOTE>Author footnote</FOOTNOTE> 
    </PERSON> 
    <PERSON ID="7094" ROLE="AUTHOR"> 
    <PREFIX>Mrs</PREFIX> 
    <FIRST_NAME>Anne</FIRST_NAME> 
    <MIDDLE_INITIALS/> 
    <LAST_NAME>Spencer</LAST_NAME> 
    <SUFFIX/> 
    <POSITION/> 
    <EMAIL_1>[email protected]</EMAIL_1> 
    <EMAIL_2/> 
    <URL/> 
    <MOBILE_PHONE/> 
    <ADDRESS> 
     <DEPARTMENT/> 
     <ORGANISATION>Example</ORGANISATION> 
     <ADDRESS_1>SEO R&amp;D Programme</ADDRESS_1> 
     <ADDRESS_2>Finch Pavilion, Middle Way</ADDRESS_2> 
     <CITY>Oxford</CITY> 
     <ZIP>OX9 7LG</ZIP> 
     <REGION>Oxfordshire</REGION> 
     <COUNTRY CODE="GB">UK</COUNTRY> 
     <PHONE_1>+380 6245 716300</PHONE_1> 
     <PHONE_2/> 
     <FAX_1>+380 6245 716311</FAX_1> 
     <FAX_2/> 
    </ADDRESS> 
    <FOOTNOTE/> 
    </PERSON> 
    <PERSON ID="15756" ROLE="AUTHOR"> 
    <PREFIX>Mr</PREFIX> 
    <FIRST_NAME>Ed</FIRST_NAME> 
    <MIDDLE_INITIALS/> 
    <LAST_NAME>Gantos</LAST_NAME> 
    <SUFFIX/> 
    <POSITION>Senior Medical Statistician</POSITION> 
    <EMAIL_1>[email protected]</EMAIL_1> 
    <EMAIL_2/> 
    <URL>http://www.isds.sxo.ac.uk/</URL> 
    <MOBILE_PHONE/> 
    <ADDRESS> 
     <DEPARTMENT>Head of SEO Support</DEPARTMENT> 
     <ORGANISATION>Centre for Statistics in Software</ORGANISATION> 
     <ADDRESS_1>Pearson College</ADDRESS_1> 
     <ADDRESS_2>Linton Road</ADDRESS_2> 
     <CITY>Oxford</CITY> 
     <ZIP>OX9 6UD</ZIP> 
     <REGION/> 
     <COUNTRY CODE="GB">UK</COUNTRY> 
     <PHONE_1>+380 6245 112404</PHONE_1> 
     <PHONE_2/> 
     <FAX_1>+380 6245 112424</FAX_1> 
     <FAX_2/> 
    </ADDRESS> 
    <FOOTNOTE/> 
    </PERSON> 
    <PERSON ID="7092" ROLE="AUTHOR"> 
    <PREFIX>Dr</PREFIX> 
    <FIRST_NAME>Sherry</FIRST_NAME> 
    <MIDDLE_INITIALS/> 
    <LAST_NAME>Wilson</LAST_NAME> 
    <SUFFIX/> 
    <POSITION/> 
    <EMAIL_1>[email protected]</EMAIL_1> 
    <EMAIL_2/> 
    <URL/> 
    <MOBILE_PHONE/> 
    <ADDRESS> 
     <DEPARTMENT/> 
     <ORGANISATION>Example</ORGANISATION> 
     <ADDRESS_1>SEO R&amp;D Programme</ADDRESS_1> 
     <ADDRESS_2>Finch Pavilion, Middle Way</ADDRESS_2> 
     <CITY>Oxford</CITY> 
     <ZIP>OX9 7LG</ZIP> 
     <REGION>Oxfordshire</REGION> 
     <COUNTRY CODE="GB">UK</COUNTRY> 
     <PHONE_1>+380 6245 716300</PHONE_1> 
     <PHONE_2/> 
     <FAX_1>+380 6245 716311</FAX_1> 
     <FAX_2/> 
    </ADDRESS> 
    <FOOTNOTE/> 
    </PERSON> 
    <GROUP ID="????"> 
    <GROUP_NAME>Bond team</GROUP_NAME> 
    <CONTACT_PERSON>Monica Bond</CONTACT_PERSON> 
    <EMAIL_1>[email protected]</EMAIL_1> 
    <URL/> 
    <ADDRESS> 
     <DEPARTMENT>Nordic Hardware Centre</DEPARTMENT> 
     <ORGANISATION>Creyts, Dept 7512</ORGANISATION> 
     <ADDRESS_1>Blegdamsvej 219</ADDRESS_1> 
     <ADDRESS_2/> 
     <CITY>Copenhagen</CITY> 
     <ZIP>2900</ZIP> 
     <REGION/> 
     <COUNTRY CODE="DK">Denmark</COUNTRY> 
     <PHONE_1>+415 7667 7110</PHONE_1> 
     <PHONE_2>+415 1234 9429</PHONE_2> 
     <FAX_1>+415 7667 7007</FAX_1> 
     <FAX_2/> 
    </ADDRESS> 
    <FOOTNOTE>Group footnote</FOOTNOTE> 
    </GROUP> 
    <PERSON ID="3" ROLE="AUTHOR"> 
    <PREFIX>Ms</PREFIX> 
    <FIRST_NAME>Monica</FIRST_NAME> 
    <MIDDLE_INITIALS/> 
    <LAST_NAME>Bond</LAST_NAME> 
    <SUFFIX/> 
    <POSITION>Director of the Hardware Information Management System</POSITION> 
    <EMAIL_1>[email protected]</EMAIL_1> 
    <EMAIL_2/> 
    <URL>www.cc-ims.net</URL> 
    <MOBILE_PHONE/> 
    <ADDRESS> 
     <DEPARTMENT>Nordic Hardware Centre</DEPARTMENT> 
     <ORGANISATION>Creyts, Dept 7512</ORGANISATION> 
     <ADDRESS_1>Blegdamsvej 219</ADDRESS_1> 
     <ADDRESS_2/> 
     <CITY>Copenhagen</CITY> 
     <ZIP>2900</ZIP> 
     <REGION/> 
     <COUNTRY CODE="DK">Denmark</COUNTRY> 
     <PHONE_1>+415 7667 7110</PHONE_1> 
     <PHONE_2>+415 1234 9429</PHONE_2> 
     <FAX_1>+415 7667 7007</FAX_1> 
     <FAX_2/> 
    </ADDRESS> 
    <FOOTNOTE/> 
    </PERSON> 
</CREATORS> 

Destination:

<?xml version="1.0" encoding="utf-8"?> 
<creatorGroup> 
    <creator affil="CD004002-aff-0001" creatorRole="author"> 
    <forenames>Mike</forenames> 
    <surnamePrefix>J</surnamePrefix> 
    <surname>Petrov</surname> 
    <note id="CD004002-note-0001"> 
     <p>Author footnote</p> 
    </note> 
    </creator> 
    <creator affil="CD004002-aff-0001" creatorRole="author"> 
    <forenames>Anne</forenames> 
    <surname>Spencer</surname> 
    </creator> 
    <creator affil="CD004002-aff-0002" creatorRole="author"> 
    <forenames>Ed</forenames> 
    <surname>Gantos</surname> 
    </creator> 
    <creator affil="CD004002-aff-0001" creatorRole="author"> 
    <forenames>Sherry</forenames> 
    <surname>Wilson</surname> 
    </creator> 
    <creator affil="CD004002-aff-0003" type="collaboration" creatorRole="author"> 
    <collab>Bond team</collab> 
    </creator> 
    <creator affil="CD004002-aff-0003" creatorRole="author"> 
    <forenames>Monica</forenames> 
    <surname>Bond</surname> 
    </creator> 
    <creator affil="CD004002-aff-0001" creatorRole="contact"> 
    <honorifics>Prof</honorifics> 
    <forenames>Mike</forenames> 
    <surnamePrefix>J</surnamePrefix> 
    <surname>Petrov</surname> 
    <jobTitle>Director</jobTitle> 
    <email>[email protected]</email> 
    <email>[email protected]</email> 
    </creator> 
    <affiliation id="CD004002-aff-0001" countryCode="GB"> 
    <orgName>Example</orgName> 
    <address> 
     <street>Finch Pavilion</street> 
     <street>Middle Way</street> 
     <city>Oxford</city> 
     <country>UK</country> 
     <postCode>OX9 7LG</postCode> 
    </address> 
    </affiliation> 
    <affiliation id="CD004002-aff-0002" countryCode="GB"> 
    <orgName>Centre for Statistics in Software</orgName> 
    <orgDiv>Head of SEO Support</orgDiv> 
    <address> 
     <street>Pearson College</street> 
     <street>Linton Road</street> 
     <city>Oxford</city> 
     <country>UK</country> 
     <postCode>OX9 6UD</postCode> 
    </address> 
    </affiliation> 
    <affiliation id="CD004002-aff-0003" countryCode="DK"> 
    <collabContact>Monica Bond</collabContact> 
    <orgName>Creyts, Dept 7512</orgName> 
    <orgDiv>Nordic Hardware Centre</orgDiv> 
    <address> 
     <street>Blegdamsvej 219</street> 
     <city>Copenhagen</city> 
     <country>Denmark</country> 
     <postCode>2900</postCode> 
    </address> 
    </affiliation> 
</creatorGroup> 

que je stylesheet XSL créé:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:key name="affiliations" match="ORGANISATION" use="."/> 

    <xsl:template name="kreator"> 
    <xsl:variable name="affid"> 
     <!-- The numbering problem is in the below line: --> 
     <xsl:number format="0001" value="position()"/> 
    </xsl:variable> 

    <xsl:variable name="role"> 
     <xsl:choose> 
     <xsl:when test="@ROLE='AUTHOR' or name()='GROUP'">author</xsl:when> 
     <xsl:otherwise>contact</xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 

    <creator affil="CD004002-aff-{$affid}"> 
     <xsl:if test="GROUP_NAME!=''"> 
     <xsl:attribute name="type">collaboration</xsl:attribute> 
     </xsl:if> 
     <xsl:attribute name="creatorRole"> 
     <xsl:value-of select="$role"/> 
     </xsl:attribute> 
     <xsl:if test="$role='contact'"> 
     <honorifics> 
      <xsl:value-of select="PREFIX"/> 
     </honorifics> 
     </xsl:if> 
     <xsl:if test="GROUP_NAME!=''"> 
     <collab> 
      <xsl:value-of select="GROUP_NAME"/> 
     </collab> 
     </xsl:if> 
     <xsl:if test="FIRST_NAME"> 
     <forenames> 
      <xsl:value-of select="FIRST_NAME"/> 
     </forenames> 
     </xsl:if> 
     <xsl:if test="MIDDLE_INITIALS!=''"> 
     <surnamePrefix> 
      <xsl:value-of select="MIDDLE_INITIALS"/> 
     </surnamePrefix> 
     </xsl:if> 
     <xsl:if test="LAST_NAME"> 
     <surname> 
      <xsl:value-of select="LAST_NAME"/> 
     </surname> 
     </xsl:if> 
     <xsl:if test="FOOTNOTE!='' and name()='PERSON'"> 
     <note id="CD004002-note-{$affid}"> 
      <p> 
      <xsl:value-of select="FOOTNOTE"/> 
      </p> 
     </note> 
     </xsl:if> 
     <xsl:if test="$role='contact'"> 
     <jobTitle><xsl:value-of select="POSITION"/></jobTitle> 
     <email><xsl:value-of select="EMAIL_1"/></email> 
     <email><xsl:value-of select="EMAIL_2"/></email> 
     </xsl:if> 

    </creator> 
    <xsl:text>&#xA;&#xA;</xsl:text> 

    </xsl:template> 

    <xsl:template match="/CREATORS"> 
    <xmp> 
     <creatorGroup> 
     <!-- list of creators: --> 
     <xsl:for-each select="PERSON[@ROLE='AUTHOR'] | GROUP"> 
      <xsl:call-template name="kreator"/> 
     </xsl:for-each> 
     <xsl:for-each select="PERSON[@ROLE='CONTACT']"> 
      <xsl:call-template name="kreator"/> 
     </xsl:for-each> 
     <!-- list of affiliations: --> 
     <xsl:for-each select="//ORGANISATION[generate-id(.)=generate-id(key('affiliations', .))]"> 
      <affiliation> 
      <xsl:attribute name="id"> 
       CD004002-aff-000<xsl:value-of select="position()"/> 
      </xsl:attribute> 
      <xsl:attribute name="countryCode"> 
       <xsl:value-of select="../COUNTRY/@CODE"/> 
      </xsl:attribute> 
      <xsl:if test="../../CONTACT_PERSON"> 
       <collabContact> 
       <xsl:value-of select="../../CONTACT_PERSON"/> 
       </collabContact> 
      </xsl:if> 
      <orgName> 
       <xsl:value-of select="."/> 
      </orgName> 
      <xsl:if test="../DEPARTMENT!=''"> 
       <orgDiv> 
       <xsl:value-of select="../DEPARTMENT"/> 
       </orgDiv> 
      </xsl:if> 
      <address> 
       <street> 
       <xsl:value-of select="../ADDRESS_1"/> 
       </street> 
       <xsl:if test="../ADDRESS_2!=''"> 
       <street> 
        <xsl:value-of select="../ADDRESS_2"/> 
       </street> 
       </xsl:if> 

       <city> 
       <xsl:value-of select="../CITY"/> 
       </city> 
       <country> 
       <xsl:value-of select="../COUNTRY"/> 
       </country> 
       <postCode> 
       <xsl:value-of select="../ZIP"/> 
       </postCode> 
      </address> 
      </affiliation> 
      <xsl:text>&#xA;&#xA;</xsl:text> 
     </xsl:for-each> 
     </creatorGroup> 
    </xmp> 
    </xsl:template> 

</xsl:stylesheet> 

à savoir Je veux obtenir <creator> numérotation comme ci-dessous:

<creator affil="CD004002-aff-0001" creatorRole="author"/> 
<creator affil="CD004002-aff-0001" creatorRole="author"/> 
<creator affil="CD004002-aff-0002" creatorRole="author"/> 
<creator affil="CD004002-aff-0001" creatorRole="author"/> 
<creator affil="CD004002-aff-0003" type="collaboration" creatorRole="author"/> 
<creator affil="CD004002-aff-0003" creatorRole="author"/> 
<creator affil="CD004002-aff-0001" creatorRole="contact"/> 

Pendant que mon stylesheet courant produit XSL mal @ de Affil:

<creator affil="CD004002-aff-0004" creatorRole="author"/> 
<creator affil="CD004002-aff-0004" creatorRole="author"/> 
<creator affil="CD004002-aff-0001" creatorRole="author"/> 
<creator affil="CD004002-aff-0004" creatorRole="author"/> 
<creator affil="CD004002-aff-0002" type="collaboration" creatorRole="author"/> 
<creator affil="CD004002-aff-0002" creatorRole="author"/> 
<creator affil="CD004002-aff-0004" creatorRole="contact"/> 

Pouvez-vous aider s'il vous plaît? Merci.

+0

Hmm sont les noms, e-mail-adresses, phoneNumbers, ... dans le vrai xml? Ils ressemblent à ça. Si oui, vous devriez vraiment anonymiser les données de poste – jitter

+0

Toutes les données (sauf pour mes propres emails) sont irréelles. – Pontorez

Répondre

2

Votre problème est que lorsque vous faites:

<xsl:call-template name="kreator" /> 

alors vous le faites dans le cadre du <PERSON> ou <GROUP> vous gérez actuellement.

Cela signifie que position() vous indiquera la position de ces éléments. Il ne peut pas savoir par magie que vous êtes intéressé par la position du premier <ORGANISATION> qui correspond à l'actuel.

Et ce signifie que vous devez itérer tous les <ORGANISATION> de la même façon que vous le faites pour calculer l'<affiliation> attribut @id:

<xsl:variable name="affid"> 
    <xsl:variable name="org" select="ADDRESS/ORGANISATION" /> 
    <xsl:for-each select="//ORGANISATION[ 
    generate-id() 
    = 
    generate-id(key('affiliations', .)[1]) 
    ]"> 
    <xsl:if test=". = $org"> 
     <xsl:number format="0001" value="position()"/> 
    </xsl:if> 
    </xsl:for-each> 
</xsl:variable> 

Notez l'utilisation de <xsl:if> pour vous assurer que la variable contient éventuellement seulement une valeur de, même si vous les parcourez tous.

Pour des documents plus volumineux, vous pouvez introduire une autre clé:

<xsl:key name="organisations" match="ORGANISATION" use="'all'" /> 

et l'utiliser comme un remplacement sans rendez-vous pour tous les relativement inefficaces « //ORGANISATION » expressions, par exemple au lieu de:

<xsl:for-each select="//ORGANISATION"> 
    <!-- ... --> 
</xsl:for-each> 

utilisation:

<xsl:for-each select="key('organisations', 'all')"> 
    <!-- ... --> 
</xsl:for-each> 
Questions connexes