代码之家  ›  专栏  ›  技术社区  ›  Ria S.

InDesign脚本:从结构面板中删除元素

  •  1
  • Ria S.  · 技术社区  · 11 年前

    我已经在InDesign中导入了一些XML文件(您可以看到下图中的结构),我还创建了一个脚本来获取有关此层次结构的一些统计信息。

    例如,要计算“自由”元素:

    var items = app.activeDocument.xmlElements.everyItem();
    var items1 = items.xmlElements.itemByName("cars");
    var cars = items1.xmlElements.everyItem();
    var c_free = cars.xmlElements.itemByName("free");
    var cars_free = c_free.xmlElements.count().length;
    
    • 我的结构中也有公寓,这就是我使用itemByName的原因。

    上面的代码返回了我的结构中正确的免费汽车数量。

    我想做的是——到目前为止没有任何运气——瞄准那些免费物品(车内),要么删除所有物品,要么删除一个特定的数字。

    我最后一次尝试是使用:

    var del1 = myInputGroup2.add ("button", undefined, "Delete All");
    del1.onClick = function () {
        cars.xmlElements.everyItem().remove();
    }
    

    在我创建的对话框中。

    任何建议都会很感激,因为我真的被困在这里了。

    Strucure

    2 回复  |  直到 11 年前
        1
  •  1
  •   Christina    11 年前

    我可能会使用XPath。您可以使用evaluateXPathExpression创建要作为目标的元素数组。假设您的根元素是cars,并且它包含名为cars1的元素,并且您希望删除cars1元素中的所有自由元素,您可以执行以下操作:

    var myDoc = app.activeDocument;
    //xmlElements[0] is your root element, in this case "cars". The xPath expression is evaluated from cars.
    //evaluateXPathExpression returns an array of all of the free elements that are children of cars. 
    var myFrees = myDoc.xmlElements[0].evaluateXPathExpression("cars1/free");
    for (var i = myFrees.length - 1; i>=0; i--){
        myFrees[i].remove();
    }
    

    调整这一点需要一些xPath的知识,但学习基本知识并不难,这似乎是最简单的方法。

        2
  •  1
  •   Tim Cooper    10 年前

    我认为您的主要问题是XMLElements没有itemByName方法。您只能通过XMLElement的indeces或id引用它们。

    其次,假设您从XPath表达式中获得了xmlElements,但很可能一无所获,因为XPath似乎不正确。

    var myFrees = myDoc.xmlElements[0].evaluateXPathExpression("./cars1/free");
    var n = myFrees.length;
    
    if ( !n ) {
      alert("Aucun élément trouvé");
    }
    else {
      while (n--) myFrees[n].remove();
    }

    您需要通过设置xpath的原点来启动表达式。这里使用点“./”来告诉您要在xml元素的“根”处查找cars1/free xml元素。相反,如果使用“//”,则会返回任何汽车/免费物品,而不管其位置如何。