InDesign JavaScript XML 属性の名前を変更

属性の名前を変更するスクリプトは、これで良いのかな・・・？

~~~JavaScript
/*
このスクリプトを利用して起こった不具合の責任は取れません。
ご了承下さい。

更新 2022/02/22
*/

// アプリ指定
#target "indesign";

// スクリプト名
var scriptName = "属性の名前を変更";

// スクリプトを実行
app.doScript(function(){
    
    // 変更名
    var changeName = prompt("選択された属性の名前を変更します。" + "\r"
                                            + "親要素が同名の属性を持つ場合は変更しません。" + "\r"
                                            + "名前を入力して下さい。", "", scriptName);

    // キャンセルされた時の処理
    if(changeName == null){

        // スクリプトを終了
        exit();
        
    // 名前にXML文法の問題がないか
    }else if(isXMLName(changeName) == false){
        
        // 警告
        alert("入力された属性名にXML文法の問題が有るようです。");
        
        // スクリプトを終了
        exit();
    }
        
    // 即時関数
    var palette = (function(){
        
        // パレットを作成
        var myPalette = new Window("palette","進行状況");
    
        // 間隔
        myPalette.spacing = 5;
        
        // 余白
        myPalette.margins = 10; 

        // 文字
        myPalette.add("statictext", [0, 0, 570, 15], "", {name: "statictext1"});

        // 表示
        myPalette.show();
        
        // パレットオブジェクトを戻す
        return myPalette;
    }());
    
    // 選択が属性の場合
    if (app.activeDocument.selection[0].constructor.name == "XMLAttribute") {
        
        // 選択数
        var selectionNumber = app.activeDocument.selection.length;
        
        // 選択の配列
        var selectionArray = app.activeDocument.selection;
        
        // 名前変更後の属性の配列
        var afterChangeNameAttributeArray = [];
        
        // 親要素
        var parentElement;
        
        // 結果数
        var resultNumber = 0;
        
        // 結果数2
        var resultNumber2 = 0;

        // 選択の数だけ後ろから繰り返す
        for (var i = selectionNumber - 1; i >= 0; i--){

            // 進行状況テキスト
            palette.statictext1.text =  (selectionNumber - i) + "/" + selectionNumber + "：" + selectionArray[i].name + "→" + changeName;

            // 変更名と選択されている属性の名前が違う場合
            if(selectionArray[i].name != changeName){

                // 親要素に変更名の属性が存在しない場合
                if(selectionArray[i].parent.xmlAttributes.itemByName(changeName).isValid == false){
                    
                    // 属性の親要素を入れる
                    parentElement = selectionArray[i].parent;
                    
                    // 名前変更
                    selectionArray[i].name = changeName;

                    // 名前変更後の属性の配列に追加
                    afterChangeNameAttributeArray.push(parentElement.xmlAttributes.itemByName(changeName));
                    
                    // 結果数を追加
                    resultNumber++;
                    
                // 存在する場合
                }else{
                    
                    // 増やす
                    resultNumber2++;
                }

            // 名前が同じ場合
            }else{

                // 名前変更後の属性の配列に追加
                afterChangeNameAttributeArray.push(selectionArray[i]);
            }
        }
    
        // 選択を解除
        app.activeDocument.selection = null;
    
        // 名前変更後の属性の数だけ繰り返す
        for(var i = 0; i < afterChangeNameAttributeArray.length; i++){
            
            // 名前変更後の属性を選択
            afterChangeNameAttributeArray[i].select(SelectionOptions.ADD_TO)
        }
        
        // 結果表示
        alert("変更数 " + resultNumber + "\r" + "親要素が同名の属性を持っており変更出来なかった数 " + resultNumber2, scriptName);

    // 以外の場合
    }else{
        
        // 警告
        alert("属性以外が選択されているようです。", scriptName);
    }

// 一つのアンドゥ履歴にする
}, ScriptLanguage.JAVASCRIPT, [], UndoModes.ENTIRE_SCRIPT, scriptName);
~~~