2017-07-27 1 views
0

J'essaie de transmettre une valeur d'un modèle à un autre modèle. Bien que j'ai trouvé quelques exemples dans ce forum, mais je suis tout simplement incapable de le faire.Passage de valeurs d'un modèle à un autre

Ci-dessous mon XML:

<pi:PayGroup xmlns:pi="urn:com.sample/file"> 
    <pi:Header> 
     <pi:Version>17</pi:Version> 
     <pi:Payroll_Company_Name>ABCD</pi:Payroll_Company_Name> 
     <pi:Pay_Group_ID>0307</pi:Pay_Group_ID> 
    </pi:Header> 
    <pi:Employee> 
     <pi:Summary> 
      <pi:Employee_ID>12345678</pi:Employee_ID> 
      <pi:Name>Test Employee</pi:Name> 
     </pi:Summary> 
     <pi:Position> 
      <pi:Business_Title>Lead Learning Specialist</pi:Business_Title> 
      <pi:Worker_Type>P</pi:Worker_Type> 
      <pi:Position_Time_Type>Full_time</pi:Position_Time_Type> 
      <pi:Compensation_Effective_Date>2017-07-01</pi:Compensation_Effective_Date> 
      <pi:Base_Pay_Currency>EUR</pi:Base_Pay_Currency> 
      <pi:Base_Pay_Frequency>4-Weekly</pi:Base_Pay_Frequency> 
      <pi:Organization_One>0307_3075999496</pi:Organization_One> 
      <pi:Organization_Two>0307</pi:Organization_Two> 
      <pi:Supervisor_ID>00295975</pi:Supervisor_ID> 
      <pi:Supervisor_Name>Simba Sang (98765432)</pi:Supervisor_Name> 
     </pi:Position> 
     <pi:Earnings> 
      <pi:Start_Date>2017-02-06</pi:Start_Date> 
      <pi:Currency>EUR</pi:Currency> 
     </pi:Earnings> 
    </pi:Employee> 
</pi:PayGroup> 

est inférieure à la XSLT qui est utilisé depuis longtemps:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pi="urn:com.workday/picof" 
    version="2.0"> 

    <xsl:output omit-xml-declaration="yes" method="xml"/> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <!-- 0... 123456 --> 
    <xsl:template match="pi:Employee_ID"> 
     <pi:Employee_ID> 
      <xsl:value-of select="substring(.,3)"/> 
     </pi:Employee_ID> 
    </xsl:template> 

    <xsl:template match="pi:Supervisor_ID"> 
     <pi:Supervisor_ID> 
      <xsl:value-of select="substring(.,3)"/> 
     </pi:Supervisor_ID> 
    </xsl:template> 

    <xsl:template match="pi:Supervisor_Name"> 
     <pi:Supervisor_Name> 
      <xsl:value-of select="normalize-space(substring-before(.,'('))"/> 
     </pi:Supervisor_Name> 
    </xsl:template> 

    <xsl:template match="pi:Organization_One"> 
     <pi:Organization_One> 
      <xsl:value-of select="if(contains(.,'_')) 
       then(normalize-space(substring-after(.,'_'))) 
       else(.)"/> 
     </pi:Organization_One> 
    </xsl:template> 

</xsl:stylesheet> 

Demandez ici est que/pi: Position/pi: valeur Compensation_Effective_Date devrait également être passé sous/pi: Earnings_Deductions/pi: balise Start_Date

pi: Start_Date doit avoir la même valeur que pi: Compensation_Effective_Date.

Je modifié le XSLT pour inclure deux autres template match un pour pi: Compensation_Effective_Date et l'autre pour/pi: start_date comme indiqué ci-dessous:

<xsl:template match="/pi:Compensation_Effective_Date"> 
    <xsl:param name="test"/> 
    <xsl:apply-templates> 
     <xsl:with-param name="test" select="."/> 
    </xsl:apply-templates> 
    <pi:Compensation_Effective_Date><xsl:value-of select="$test"/></pi:Compensation_Effective_Date>   
</xsl:template> 

<xsl:template match="pi:Start_Date"> 
    <xsl:param name="test"/> 
    <pi:Start_Date><xsl:value-of select="$test"/></pi:Start_Date> 
</xsl:template> 

avait une valeur param dans pi: modèle compensation_effective_date et passé ce param à pi: modèle start_date. Mais le pi: Start_Date est toujours vide; Comment puis-je obtenir la valeur de compensation_effective_Date dans start_date?

Résultats escomptés:

<pi:Position> 
    <pi:Business_Title>...</pi:Business_Title> 
    <pi:Worker_Type>..</pi:Worker_Type> 
    <pi:Position_Time_Type>..</pi:Position_Time_Type> 
    <pi:Compensation_Effective_Date>2017-07-01</pi:Compensation_Effective_Date> 
    <pi:Base_Pay_Currency>..</pi:Base_Pay_Currency> 
    <pi:Base_Pay_Frequency>...</pi:Base_Pay_Frequency> 
    <pi:Organization_One>....</pi:Organization_One> 
    <pi:Organization_Two>....</pi:Organization_Two> 
    <pi:Supervisor_ID>....</pi:Supervisor_ID> 
    <pi:Supervisor_Name>.....</pi:Supervisor_Name> 
</pi:Position> 
<pi:Earnings> 
    <pi:Start_Date>2017-07-01</pi:Start_Date> 
    <pi:Currency>...</pi:Currency> 
</pi:Earnings> 

+0

Je vous suggère de réduire l'exemple au minimum requis pour démontrer le problème - voir: [mcve]. –

Répondre

0

"En l'absence d'un attribut select, l'instruction xsl:apply-templates traite tous les enfants du noeud courant [...]" (W3C) . Cela signifie que votre modèle correspondant <Start_Date> ne peut pas fonctionner dans le contexte de <Compensation_Effective_Date> car il n'y a pas d'élément <Start_Date> dans celui-ci. Au lieu de cela, le modèle <Start_Date> - comme les autres modèles - correspond simplement au contenu et est appliqué sans paramètres, c'est pourquoi <Start_Date> est vide dans votre sortie.

Je n'arrivais pas à le faire fonctionner comme vous le vouliez, mais je pourrais avoir quelques indices pour vous aider à démarrer. Pour les extraits de code suivants, notez que j'ai supprimé l'espace de noms pi: car cela a causé des problèmes dans mon éditeur.

1.) Solution facile

Il est possible de se référer simplement à l'élément source souhaitée, même si elle est en dehors du contexte actuel. Cela produira la sortie désirée:

<xsl:template match="Start_Date"> 
    <Start_Date><xsl:value-of select="../../Position/Compensation_Effective_Date"/></Start_Date> 
</xsl:template> 

Soyez prudent en utilisant ceci, par exemple. dans le cas où un employé peut avoir plus d'un élément de position.

2.) Utiliser <xls:call-template> et paramètre

J'ai ajusté le "call-template-syntaxe" de this answer pour adapter votre exemple.

<xsl:template match="Employee"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    <xsl:call-template name="t"> 
     <xsl:with-param name="p" select="Position/Compensation_Effective_Date"/> 
    </xsl:call-template> 
</xsl:template> 

<xsl:template name="t"> 
    <xsl:param name="p"/> 
    <Start_Date><xsl:value-of select="$p"/></Start_Date> 
</xsl:template> 

Le paramètre est transféré au modèle "t" avec succès et apparaît dans la sortie, mais pas au bon endroit. Maintenant, le problème est d'entrer dans le bon contexte et d'y insérer le Tag. Peut-être que quelqu'un peut construire sur cela et fournir une solution de travail en utilisant des paramètres.

+1

W3Schools sont ** PAS ** le W3C et (sans surprise) la phrase que vous citez d'eux est incorrecte. 'xsl: apply-templates' ne s'applique pas ** ** à l'élément courant (à moins que vous ne le sélectionniez explicitement). Si c'était le cas, vous seriez coincé dans une boucle sans fin. - Je ne commente pas le reste de votre réponse, parce que je n'ai pas lu la question (trop longtemps). –

+0

Merci pour l'indice, mon mauvais! J'ai changé la citation et la source. – everdream