2017-11-12 3 views
0

Ich werde keine bekommen. von xml und ich muss sie mit XSLT in das passende json Format konvertieren. Ich kann alles außer Array konvertieren. Ich muss Vorlagen generisch halten.XSLT Array iterieren und generische Vorlage auf Unterelemente anwenden (Xml zu Json)

Here ist Kern Probe Beispiel (XML, XSL und Ergebnis) mit Szenario - Konto mit m Abteilungen mit n Mitarbeitern.

XSL funktioniert für alle Szenarien einschließlich komplexer Objekte. Es wendet jedoch keine ideale JSON-Formatierung auf ein Array an. Es hängt auch den Objektnamen an jedes einzelne Element des Arrays an. In Wirklichkeit habe ich sehr komplexe/verschachtelte XML, also muss ich xslt so allgemein wie möglich halten.

Wenn ich die folgenden zwei Vorlagen hinzufüge, wird kein Komma nach Blattknoten hinzugefügt.

<xsl:template match="departments"> 
    <xsl:text>"departments": [{</xsl:text> 
    <xsl:for-each select=".//department"> 
     <xsl:if test="position() > 1"> 
      <xsl:text>},{</xsl:text> 
     </xsl:if> 
     <xsl:apply-templates /> 
    </xsl:for-each> 
    <xsl:text>}]</xsl:text> 
</xsl:template> 

<xsl:template match="employees"> 
    <xsl:text>"employees": [{</xsl:text> 
    <xsl:for-each select=".//employee"> 
     <xsl:if test="position() > 1"> 
      <xsl:text>},{</xsl:text> 
     </xsl:if> 
     <xsl:apply-templates /> 
    </xsl:for-each> 
    <xsl:text>}]</xsl:text> 
</xsl:template> 

Ich habe erwartet-result.json in Gist auch kopiert. Gibt es eine Möglichkeit, das Unterelement eines Arrays zu iterieren und eine Vorlage auf das verschachtelte Objekt oder eine andere Logik anzuwenden?

+0

I verwenden in der Regel [w3schools] (https://www.w3schools.com/xml/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog) für eine schnelle Umwandlung zu testen. – GovindS

+0

Zumindest müssen Sie angeben (möglicherweise in einer Variablen innerhalb Ihres XSLT), welche Elemente als Arrays behandelt werden müssen. Andernfalls könnte Ihr XSLT möglicherweise kein JSON-Array anstelle eines Objekts ausgeben. TBH, ich glaube nicht, dass XSLT eine sehr gute Wahl für die Konvertierung von XML zu JSON ist. Wie beabsichtigen Sie, alle komplexen Regeln für das Austreten von JSON zu handhaben? – JLRishe

+0

@JLRishe Ja, wir müssen Elemente angeben, die als Array behandelt werden müssen. Ich habe meine Implementierung in Frage gestellt. Aber brauchen Verbesserung. Es geht vielmehr um die Erstellung von benutzerdefiniertem JSON. Ich muss nur über Elemente informieren, die als Arrays behandelt werden müssen. Alles andere wird von einer Vorlage übernommen, die ich geteilt habe. – GovindS

Antwort

0

Fügen Sie die neue Vorlage array-obj hinzu und rufen Sie sie aus der Vorlage auf, wobei die Felder employees und departments übereinstimmen.

<xsl:template name="array-obj"> 
    <xsl:text>{ 
</xsl:text> 
    <xsl:for-each select="*"> 
     <xsl:if test="position() > 1"> 
      <xsl:text>, 
</xsl:text> 
     </xsl:if> 
     <xsl:apply-templates select="."/> 
    </xsl:for-each> 
     <xsl:text> 
</xsl:text> 
    <xsl:text>}</xsl:text> 
</xsl:template> 

employees und departments Vorlage muss wie unten verändert werden. Entfernen Sie geschweifte Klammern aus der Vorlage.

<xsl:template match="employees"> 
    <xsl:text>"employees": [</xsl:text> 
    <xsl:for-each select=".//employee"> 
     <xsl:if test="position() > 1"> 
      <xsl:text>,</xsl:text> 
     </xsl:if> 
     <xsl:call-template name="array-obj"/> 
    </xsl:for-each> 
    <xsl:text>]</xsl:text> 
</xsl:template>