523 Stimmen

XSLT-Äquivalent für JSON

Gibt es eine XSLT Äquivalent für JSON? Etwas, das es mir ermöglicht, JSON so zu transformieren, wie XSLT es bei XML tut.

1 Stimmen

Übrigens, in welcher Sprache/Plattform soll das geschehen?

9 Stimmen

@StaxMan XSLT ist ein Standard, der in vielen Sprachen und Plattformen implementiert ist, und meine Fragen zielen auf ein ähnliches Vorhaben ab.

0 Stimmen

Ja, aber auch wenn es keine exakte Entsprechung zu geben scheint, könnte es für eine Teilmenge von Sprachen anwendbare Werkzeuge geben, die helfen könnten.

15voto

Derek Curtis Punkte 239

Ich habe kürzlich ein Tool gefunden, das ich für die Gestaltung von JSON liebe: https://github.com/twigkit/tempo . Ein sehr einfach zu verwendendes Tool, das meiner Meinung nach viel einfacher zu handhaben ist als XSLT, da keine XPATH-Abfragen erforderlich sind.

13voto

Chris Punkte 602

Werfen Sie einen Blick auf jsonpath-object-transform

11voto

Rick Punkte 147

Die Behauptung, dass ein Mangel an Werkzeugen auf einen Mangel an Bedarf schließen lässt, ist schlichtweg unlogisch. Das Gleiche gilt für die Unterstützung von X oder Y in Linux (Warum sollte man sich die Mühe machen, qualitativ hochwertige Treiber und/oder Spiele für ein so unbedeutendes Betriebssystem zu entwickeln? Und warum sollte man sich um ein Betriebssystem kümmern, für das die großen Spiele- und Hardwarefirmen nicht entwickeln?). Wahrscheinlich verwenden die Leute, die XSLT und JSON verwenden müssten, eine etwas triviale Lösung: Die Umwandlung von JSON in XML. Aber das ist nicht die optimale Lösung, oder?

Wenn Sie ein natives JSON-Format haben und es "wysywyg" im Browser bearbeiten wollen, wäre XSLT eine mehr als angemessene Lösung für das Problem. Tun, dass mit traditionellen Javascript-Programmierung kann ein Schmerz in den Arsch zu werden.

In der Tat habe ich eine "Steinzeit"-Ansatz für XSLT, mit Substring Parsing zu interpretieren einige grundlegende Befehle für Javascript, wie der Aufruf einer Vorlage, Prozess Kinder, etc. Sicherlich ist die Implementierung einer Transformations-Engine mit einem JSON-Objekt viel einfacher als die Implementierung eines vollwertigen XML-Parsers zum Parsen der XSLT. Das Problem ist, dass XML-Vorlagen zu verwenden, um ein JSON-Objekt zu transformieren, müssen Sie das XML der Vorlagen zu parsen.

Um ein JSON-Objekt in XML (oder HTML, oder Text oder was auch immer) umzuwandeln, müssen Sie sich die Syntax genau überlegen und wissen, welche Sonderzeichen Sie zur Kennzeichnung der Umwandlungsbefehle verwenden müssen. Andernfalls müssen Sie am Ende einen Parser für Ihre eigene benutzerdefinierte Templating-Sprache entwerfen. Nachdem ich diesen Weg gegangen bin, kann ich Ihnen sagen, dass das nicht schön ist.

Aktualisierung (12. November 2010): Nachdem ich ein paar Wochen an meinem Parser gearbeitet habe, konnte ich ihn nun optimieren. Vorlagen werden vorher geparst und Befehle werden als JSON-Objekte gespeichert. Transformationsregeln sind ebenfalls JSON-Objekte, während der Vorlagencode eine Mischung aus HTML und einer selbstgebastelten Syntax ähnlich dem Shellcode ist. Es ist mir gelungen, ein komplexes JSON-Dokument in HTML umzuwandeln, um einen Dokumenteneditor zu erstellen. Der Code umfasst etwa 1.000 Zeilen für den Editor (für ein privates Projekt, so dass ich ihn nicht weitergeben kann) und etwa 990 Zeilen für den JSON-Transformationscode (einschließlich Iterationsbefehlen, einfachen Vergleichen, Vorlagenaufrufen, Variablenspeicherung und -auswertung). Ich plane, es unter einer MIT-Lizenz zu veröffentlichen. Schicken Sie mir eine Mail, wenn Sie sich beteiligen wollen.

11voto

Mr. Lance E Sloan Punkte 2952

Als weitere neue Antwort auf eine alte Frage empfehle ich einen Blick auf DefiantJS . Es ist kein XSLT gleichwertig für JSON, es est XSLT für JSON. Der Abschnitt "Templating" in der Dokumentation enthält dieses Beispiel:

<!-- Defiant template -->
<script type="defiant/xsl-template">
    <xsl:template name="books_template">
        <xsl:for-each select="//movie">
            <xsl:value-of select="title"/><br/>
        </xsl:for-each>
    </xsl:template>
</script>

<script type="text/javascript">

var data = {
        "movie": [
            {"title": "The Usual Suspects"},
            {"title": "Pulp Fiction"},
            {"title": "Independence Day"}
        ]
    },
    htm = Defiant.render('books_template', data);

console.log(htm);
// The Usual Suspects<br>
// Pulp Fiction<br>
// Independence Day<br>

9voto

ColinE Punkte 66577

Jetzt schon! Ich habe kürzlich eine Bibliothek erstellt, json-transforms genau zu diesem Zweck:

https://github.com/ColinEberhardt/json-transforms

Es verwendet eine Kombination aus JSPath , einer DSL nach dem Vorbild von XPath, und einem rekursiven Pattern-Matching-Ansatz, der direkt von XSLT inspiriert ist.

Hier ist ein kurzes Beispiel. Gegeben sei das folgende JSON-Objekt:

const json = {
  "automobiles": [
    { "maker": "Nissan", "model": "Teana", "year": 2011 },
    { "maker": "Honda", "model": "Jazz", "year": 2010 },
    { "maker": "Honda", "model": "Civic", "year": 2007 },
    { "maker": "Toyota", "model": "Yaris", "year": 2008 },
    { "maker": "Honda", "model": "Accord", "year": 2011 }
  ]
};

Hier ist eine Umwandlung:

const jsont = require('json-transforms');
const rules = [
  jsont.pathRule(
    '.automobiles{.maker === "Honda"}', d => ({
      Honda: d.runner()
    })
  ),
  jsont.pathRule(
    '.{.maker}', d => ({
      model: d.match.model,
      year: d.match.year
    })
  ),
  jsont.identity
];

const transformed  = jsont.transform(json, rules);

Welche Ausgabe der folgenden:

{
  "Honda": [
    { "model": "Jazz", "year": 2010 },
    { "model": "Civic", "year": 2007 },
    { "model": "Accord", "year": 2011 }
  ]
}

Diese Transformation setzt sich aus drei Regeln zusammen. Die erste passt zu jedem Auto, das von Honda hergestellt wird und ein Objekt mit einem Honda Eigenschaft, dann rekursiv passend. Die zweite Regel passt auf jedes Objekt mit einer maker Eigenschaft, die Ausgabe der model y year Eigenschaften. Die letzte ist die Identitätstransformation, die rekursiv passt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X