Ordnen Sie XML-Elemente in Extendscript Indesign neu an

Flazzarini

Ich möchte die folgende Liste von Filmen so neu anordnen, dass Filme von version==3Dvor denen in platziert werden sollten version==2D.

Eingang

<films>
  <film name="Foobar" version="2D"></film>
  <film name="Foobar" version="3D"></film>
  <film name="Foobaz" version="2D"></film>
  <film name="Foobaz" version="3D"></film>
</films>

Gewünschte Ausgabe

<films>
  <film name="Foobar" version="3D"></film>
  <film name="Foobar" version="2D"></film>
  <film name="Foobaz" version="3D"></film>
  <film name="Foobaz" version="2D"></film>
</films>

Ich habe herumgespielt und bin mit dem folgenden Code gelandet. Hoffentlich verständlich.

/***
 Extend Array prototype to have a indeOf function
 ***/
Array.prototype.indexOf = function(item) { 
    var index = 0, length = this.length;  
    for ( ; index < length; index++ ) {
        if ( this[index] == item )  
            return index;  
        }  
    return -1;  
};  


var xmlString = '\
<films>\
    <film name="Foobar" version="2D"></film>\
    <film name="Foobar" version="3D"></film>\
    <film name="Foobaz" version="2D"></film>\
    <film name="Foobaz" version="3D"></film>\
</films>';

var xml = new XML(xmlString);
var sortVersion = ['2D', '3D'];
var uniqueMovies = new Array();


for (var index = 0; index < xml.elements().length(); index++) {
    if (index == 0) continue;

    // Fetch meta data of previous movie
    var prevTitle = xml.elements()[index - 1].@name;
    var prevVersion = xml.elements()[index - 1].@version;
    var prevVersionIdx = sortVersion.indexOf(prevVersion);

    // Fetch meta data of current movie
    var curTitle = xml.elements()[index].@name;
    var curVersion = xml.elements()[index].@version;
    var curVersionIdx = sortVersion.indexOf(curVersion);

    // If both movie title matches verify which movie should be prioritized
    if (prevTitle == curTitle) {
      if (prevVersionIdx < curVersionIdx) { 
          // Movie prio movie before less prio movie
          xml.insertChildBefore(xml.elements()[index - 1], xml.elements()[index]);
          // And delete the next in index
          delete xml.elements()[index + 1];
      }
    }   
}

$.writeln("-----");
$.writeln("");
$.writeln(xml.elements().toString());
return xml

Wenn ich dieses Skript ausführe, beende ich jedoch mit dem folgenden Ergebnis, bei dem überhaupt nichts geändert wird, obwohl beide Bedingungen erfüllt sind und das Element on index[1]zuvor hinzugefügt wurde index[0].

<films>
  <film name="Foobar" version="2D"/>
  <film name="Foobar" version="3D"/>
  <film name="Foobaz" version="2D"/>
  <film name="Foobaz" version="3D"/>
</films>

Hat jemand eine Idee was ich hier falsch mache?

RobC

Betrachten Sie stattdessen den folgenden Ansatz:

script.jsx

/**
 * Extend Array prototype to have a indexOf function
 */
Array.prototype.indexOf = function(item) {
    var index = 0, length = this.length;
    for ( ; index < length; index++ ) {
        if ( this[index] == item )
            return index;
        }
    return -1;
};

var xmlString = '\
<films>\
  <film name="Foobar" version="2D"></film>\
  <film name="Foobar" version="3D"></film>\
  <film name="Foobaz" version="2D"></film>\
  <film name="Foobaz" version="3D"></film>\
  <film name="Foo" version="3D"></film>\
  <film name="Quux" version="2D"></film>\
  <film name="Quux" version="3D"></film>\
</films>';

var xml = new XML(xmlString);
var sortVersion = ['2D', '3D'];

// 1. Create a temporary XML object with a  matching `films` root element.
var tempXml = new XML('<' + xml.name() + '></' + xml.name() + '>');

for (var index = 0, max = xml.elements().length(); index < max; index++) {

  // Fetch meta data of previous movie
  var prevTitle = String(xml.elements()[index - 1].@name);
  var prevVersion = xml.elements()[index - 1].@version;
  var prevVersionIdx = sortVersion.indexOf(prevVersion);

  // Fetch meta data of current movie
  var curTitle = String(xml.elements()[index].@name);
  var curVersion = xml.elements()[index].@version;
  var curVersionIdx = sortVersion.indexOf(curVersion);

  // 2. Insert each XML element node from the original XML Object into
  // the temporary XML Object and position (i.e. sort) as neccessary.
  if (prevTitle === curTitle && prevVersion < curVersion) {
    tempXml.insertChildBefore(tempXml.elements()[index -1], xml.elements()[index])
  } else {
    // There's nothing to change (i.e. sort) so insert it as-is .
    tempXml.insertChildBefore(tempXml.elements()[index], xml.elements()[index])
  }
}

// 3. Overwrite original XML object's children with temporary (sorted) XML objects children.
xml.setChildren(tempXml.children());

// 4. Delete temporary XML object.
tempXml = undefined;


// Testing...
$.writeln(xml)
$.writeln('-----------------')
$.writeln(xml.elements().length())
$.writeln('-----------------')

Erläuterung:

Anstatt zu versuchen, das ursprüngliche XML-Objekt zu manipulieren (dh zu sortieren), führt das obige Gist stattdessen Folgendes aus:

  1. Erstellt ein anderes XML-Objekt, das nur ein <films>Stammelement enthält . Dieses XML-Objekt ist temporär.

  2. Während jeder Umdrehung der forSchleife wir;

    • Fügen Sie einen Klon jedes XML-Elementknotens aus dem ursprünglichen XML-Objekt in das temporäre XML-Objekt ein.
    • Positionieren (dh sortieren) Sie jeden XML-Elementknoten nach Bedarf.
  3. Überschreiben Sie die ursprünglichen untergeordneten Elementknoten von XML-Objekten mit untergeordneten Elementknoten aus dem temporären / sortierten XML-Objekt.

  4. Schließlich löschen wir das temporäre XML-Objekt (dh setzen es auf undefined), da es nicht mehr benötigt wird.


Ergebnis

Das obige Beispiel enthält das folgende Quell-XML:

<films>
  <film name="Foobar" version="2D"></film>
  <film name="Foobar" version="3D"></film>
  <film name="Foobaz" version="2D"></film>
  <film name="Foobaz" version="3D"></film>
  <film name="Foo" version="3D"></film>
  <film name="Quux" version="2D"></film>
  <film name="Quux" version="3D"></film>
</films>

welches in folgendes umgewandelt wird:

<films>
  <film name="Foobar" version="3D"/>
  <film name="Foobar" version="2D"/>
  <film name="Foobaz" version="3D"/>
  <film name="Foobaz" version="2D"/>
  <film name="Foo" version="3D"/>
  <film name="Quux" version="3D"/>
  <film name="Quux" version="2D"/>
</films>

Hinweis: Für komplexere XML-Strukturen und Transformationsanforderungen als das in Ihrer Frage angegebene Beispiel würde ich stattdessen XSLT verwenden. Angesichts Ihrer aktuellen Anforderungen erzielt eine Vorlage wie diese das gewünschte Ergebnis.

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

Ordnen Sie Array-Elemente in cmd neu an

Ordnen Sie HTML-Elemente in dom neu an

Ordnen Sie Elemente mit JavaScript neu an

Ordnen Sie die Elemente eines Arrays anhand mehrerer Kriterien neu an

Ordnen Sie DOM-Elemente auf verschiedenen Bildschirmgrößen neu an

Python - Ordnen Sie Elemente in einem 3D-Array neu an

So ordnen Sie Elemente in der Warteschlange neu an, ohne den Index der Elemente zu kennen

So ordnen Sie XML-Tags vom Marschall neu an

Ordnen Sie Array-Elemente in JavaScript diagonal mit Schlüsseln neu an / transponieren Sie sie

Ordnen Sie die Menüelemente im Bereich "Mein Konto" von Woocommerce neu an

JavaScript: Ordnen Sie Array-Elemente entsprechend der absoluten Differenz zu x neu an

SwiftUI | Verwenden Sie onDrag und onDrop, um Elemente in einem einzigen LazyGrid neu zu ordnen?

Ordnen Sie die DOM-Elemente gemäß dem angegebenen Standard neu an

Ordnen Sie die visuelle Reihenfolge der Elemente neu an, ohne den HTML-Code zu ändern

Ordnen Sie HTML-Elemente in mehreren Spalten neu an (von einer Spalte zur anderen)

Wie ordnen Sie Elemente in einer Listenansicht entsprechend ihrer Priorität neu an?

Ordnen Sie Array-Elemente abhängig von der Teilzeichenfolge neu an, die die Zeit in PHP darstellt

Ordnen Sie die Reihenfolge, in der HTML-Elemente angezeigt werden, mit JavaScript oder jQuery neu an

Ordnen Sie unsymmetrische Zeitreihendaten neu an

Ordnen Sie die Zeilenwerte neu an

Führen Sie ExtendScript in InDesign über AppleScript aus

So definieren Sie einen Zeilenumbruch in Extendscript für Adobe Indesign

Flexbox: Reduzieren Sie 2 Spalten zu einer einzelnen Spalte auf mobilen Elementen, aber ordnen Sie die Elemente neu an

Entfernen Sie Array-Elemente basierend auf doppelten Werten für Sub-Arrays und ordnen Sie das Array neu an

So ordnen Sie eine XML-Datei mit xslt neu an und behalten dabei die Struktur bei

So ordnen Sie eine Liste neu an, die auf einer anderen Liste basiert, die dieselben Elemente in Python enthält

Ordnen Sie den gemischten Eingabedatenrahmen neu an

So ordnen Sie in Haskell mehrere Arten neu an

R: So ordnen Sie ein Listenobjekt neu an

TOP Liste

  1. 1

    Wie aktualisiere ich ein Feld in einer Raumdatenbank mit einem Repository und einem Ansichtsmodell?

  2. 2

    Wie füge ich mehrere Spalten in einer Spalte mit derselben Tabelle in SQL Server zusammen?

  3. 3

    Wie kann man Gitterquadrate dazu bringen, die Farbe zu ändern?

  4. 4

    Ich kann nicht verstehen, wie man Go-Code in mehreren Dateien kompiliert

  5. 5

    Zählen Sie die Vorkommen jedes Werts in einem Tupel in Python

  6. 6

    Gibt es eine sauberere Möglichkeit, Konstruktorargumente und Instanzeigenschaften einer Klasse in Typescript zu definieren?

  7. 7

    So implementieren Sie Pushwoosh mit ionic 2

  8. 8

    Wie wird der Wert im Dropdown-Menü basierend auf den ausgewählten Daten / IDs angezeigt?

  9. 9

    Tomcat - Leiten Sie den alten Kontextstamm zum neuen Kontextstamm um

  10. 10

    Ändern Sie den Knotenpfad in das aktuelle Verzeichnis

  11. 11

    So erstellen Sie ein Array von Objekten aus zwei Arrays von Objekten mit einem gemeinsamen Schlüssel - JavaScript

  12. 12

    Rufen Sie die ID aus der Datagrid-Ansicht ab und zeigen Sie die Daten in Textfeldern einem anderen Formular an

  13. 13

    base js: Wie füge ich einem Objekt eine Eigenschaft auf die 'alte' Weise hinzu?

  14. 14

    Ersetze einen Teil einer Zeichenfolge durch eine Pandas-Spalte als Muster

  15. 15

    Blättern Sie auf Radio Click zur Abschnitts-ID

  16. 16

    CBCentralManager wird nach dem Verbinden neu gestartet

  17. 17

    Scherz, wie man eine Funktion verspottet, die von einer verspotteten Funktion zurückgegeben wird

  18. 18

    django-allauth Empfängersignal zum Hinzufügen einer Gruppenberechtigung zum Benutzer bei der Anmeldung

  19. 19

    Tic Tac Toe-Spiel im React-Reset-Button funktioniert nicht

  20. 20

    AQL: Teilweise Übereinstimmung in einer Reihe von Zeichenfolgen

  21. 21

    So summieren Sie die Werte zweier Tabellen und gruppieren sie nach Datum

heißlabel

Archiv