2016-07-13 12 views
2

Ich versuche, mein XML-Dokument zu verwenden und es mithilfe von XSLT in eine andere XML-Struktur umzuwandeln.Erstellen einer XML-Struktur mit dynamischen Elementnamen mithilfe von XSLT mit XML-Eingabe

Hier ist meine Eingabe XML:

<?xml version="1.0" encoding="UTF-8"?> 
<ProcessData> 
<FTPRemoteHost>RACHEL</FTPRemoteHost> 
    <CodeListValues> 
    <BCBSRI_FTP_GET> 
     <PARM>CD</PARM> 
     <VALUE>/Desktop/Rachel</VALUE> 
     <DTM/> 
    </BCBSRI_FTP_GET> 
    <BCBSRI_FTP_GET> 
     <PARM>FTPProfileName</PARM> 
     <VALUE>1234567890</VALUE> 
     <DTM>yyyyMMdd</DTM> 
    </BCBSRI_FTP_GET> 
    <BCBSRI_FTP_GET> 
     <PARM>FileName1</PARM> 
     <VALUE>Rachel.txt</VALUE> 
     <DTM>yyyyMMdd</DTM> 
    </BCBSRI_FTP_GET> 
    <BCBSRI_FTP_GET> 
     <PARM>MV/DEL</PARM> 
     <VALUE>MOVE</VALUE> 
     <DTM/> 
    </BCBSRI_FTP_GET> 
    <BCBSRI_FTP_GET> 
     <PARM>SFG_MBX</PARM> 
     <VALUE>/inbox/Rachel</VALUE> 
     <DTM/> 
    </BCBSRI_FTP_GET> 
    </CodeListValues> 
</ProcessData> 

ich viele verschiedene Lösungen ausprobiert habe ich hier gefunden, aber ich bin nicht in der Lage meine Struktur zu erhalten, die Art und Weise erscheinen ich es will. Hier ist meine XSLT so weit:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" /> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="/"> 
    <table> 
     <xsl:for-each select="ProcessData/CodeListValues"> 
     <xsl:for-each select="BCBSRI_FTP_GET"> 
      <xsl:value-of select="PARM"/> 
      <xsl:value-of select="VALUE"/> 
      <xsl:value-of select="DTM"/> 
     </xsl:for-each>  
     </xsl:for-each> 
    </table> 
</xsl:template> 
</xsl:stylesheet> 

Ich brauche die Ausgabe der folgenden Muster folgen:

<CD>/Desktop/Rachel</CD> 
<FTPProfileName>1234567890</FTPProfileName> 
<DTM>yyyyMMdd</DTM> 
<FileName1>Rachel.txt</FileName1> 
<DTM>yyyyMMdd</DTM> 
<MV/DEL>MOVE</MV/DEL> 
<SFG_MBX>/inbox/Rachel</SFG_MBX> 

Antwort

1

Es sieht aus wie Sie ein Element mit einem Namen aus dem PARM Element angegeben erstellt werden soll, enthält die Wert von VALUE. Um dies zu tun, können Sie verwenden, um die xsl:element Element

<xsl:element name="{PARM}"> 
    <xsl:value-of select="VALUE"/> 
</xsl:element> 

Sie werden jedoch nicht in der Lage sein, die genaue Resultat für Ihre Anfrage zu erhalten, weil ein / nicht gültig in einem Elementnamen ist, und so <MV/DEL> ist kein gültiges XML Element. Sie müssen die / in etwas, das gültig ist, vielleicht übersetzen?

dieses XSLT für den Anfang Versuchen Sie, obwohl Sie haben zwei Vorlagen passend /

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" /> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/"> 
    <table> 
     <xsl:for-each select="ProcessData/CodeListValues"> 
     <xsl:for-each select="BCBSRI_FTP_GET"> 
      <xsl:element name="{translate(PARM, '/', '-')}"> 
       <xsl:value-of select="VALUE"/> 
      </xsl:element> 
      <xsl:copy-of select="DTM[normalize-space()]"/> 
     </xsl:for-each>  
     </xsl:for-each> 
    </table> 
</xsl:template> 
</xsl:stylesheet> 

Sie beachten Sie, dass in Ihrem XSLT in Ihrer Frage (dies die / zu einem - ändert). Dies wird in XSLT als Fehler angesehen, um zwei Vorlagen zu erhalten, die mit der gleichen Priorität übereinstimmen. XSLTs können den Fehler entweder kennzeichnen oder alle bis auf die letzte Vorlage ignorieren.

Beachten Sie auch den Unterschied zwischen xsl:copy-of und xsl:value-of. Using xsl:copy-of kopiert den gesamten Knoten, während xsl:value-of nur den String-Wert davon ausgibt.

Verwandte Themen