[解説]Xpath setattribute/removeattribute[初級編]

v2.0

はじめに

本稿では、Xpathの「setattribute」「removeattribute」タグについて解説します。
Xpathって何?って方は、まずこちらを確認ください)

以下の順番に解説していきます。

  • setattribute/removeattributeとは?
  • 使い方
  • 使うとどうなる?

setattribute/removeattribute とは?

Set Attribute」「Remove Attribute」とは、日本語で「属性の追加/属性の取り除き」という意味を持ちます。

Xpath上でもそのまま「属性の操作」を行えます。
そもそも「属性って何?」という方もいると思います。

属性とは、Xml上でいうところの「key=”value”」のような形式でタグ内に記述されているものです。

[例]

<passive_effect name="EntityDamage" />

上記の例でいうと、

  • passive_effect: タグ
  • name: 属性のキー
  • EntityDamage: 属性の

という分類になっています。

setattribute/removeattribute では、この「属性」部分を操作します。

使い方

setattribute(Set Attribute)

まず、以下のようなアイテムがあったとします。

<items>
    <item name="Item1">
        <effect_group>
            <passive_effect name="EntityDamage" operation="base_set" value="100" />
            <passive_effect name="EntityDamage" operation="base_add" value="20" />
        </effect_group>
    </item>
</items>

上記のXmlは、基礎攻撃力[100],追加攻撃力[20] のアイテムです。
(例なので色んな情報を端折っています)

このアイテムの追加攻撃力を[30]にしたい場合に以下のように使えます。

<setattribute xpath="items/item[@name='Item1']/effect_group/passive_effect[@name='EntityDamage" and @operation='base_add']" name="value">30</setattribute>

上記のようなxmlを適用すると、「EntityDamage」かつ「base_add」の「passive_effect」の「value」の値を上書きできます。

また、「append」などとは少し違った書き方なので最初は戸惑うかもしれません。
name=”value”」 の部分は、

  • name: 固定値
  • value: 変更したい属性のキー名
[xpath適用前]
<items>
    <item name="Item1">
        <effect_group>
            <passive_effect name="EntityDamage" operation="base_set" value="100" />
            <passive_effect name="EntityDamage" operation="base_add" value="20" />
        </effect_group>
    </item>
</items>

[xpath適用後]
<items>
    <item name="Item1">
        <effect_group>
            <passive_effect name="EntityDamage" operation="base_set" value="100" />
            <passive_effect name="EntityDamage" operation="base_add" value="30" />
        </effect_group>
    </item>
</items>

appendで追加すればよくね?」と一瞬思うかもしれません。
ですが、これは「base_add」の性質なのですが「base_add」の要素は後から同じ要素を追加すると、「上書き」されていくのではなく「加算」されていきます。
ですので、仮に「append」で記載した場合、以下のようになります。

[xpath]
<append xpath="items/item[@name='Item1']">
    <effect_group>
        <passive_effect name="EntityDamage" operation="base_add" value="30" />
    </effect_group>
</append>

[xpath適用前]
<items>
    <item name="Item1">
        <effect_group>
            <passive_effect name="EntityDamage" operation="base_set" value="100" />
            <passive_effect name="EntityDamage" operation="base_add" value="20" />
        </effect_group>
    </item>
</items>

[xpath適用後]
<items>
    <item name="Item1">
        <effect_group>
            <passive_effect name="EntityDamage" operation="base_set" value="100" />
            <passive_effect name="EntityDamage" operation="base_add" value="20" />
        </effect_group>
        <effect_group>
            <passive_effect name="EntityDamage" operation="base_add" value="30" />
        </effect_group>
    </item>
</items>

こうなると、1つ目の「base_add」と2つ目の「base_add」の値が合算されてアイテムの情報が
基礎攻撃力[100]、追加攻撃力[50(20+30)]となってしまい、想定していた内容になりません。

removeattribute(Remove Atrribute)

setattribute」と比べると、正直そこまで使い道はないです。

バニラに設定されている属性は、大抵なければいけない項目が多く意図的に消す必要があるケースが思いつきません。
一応使い方は記載しますがほとんど使わないと思います。

[xpath]
<removeattribute xpath="items/item[@name='Item1']/effect_group/passive_effect[@name='EntityDamage']/@value" />

[xpath適用前]
<items>
    <item name="Item1">
        <effect_group>
            <passive_effect name="EntityDamage" operation="base_set" value="100" />
            <passive_effect name="BlockDamage" operation="base_set" value="20" />
        </effect_group>
    </item>
</items>

[xpath適用後]
<items>
    <item name="Item1">
        <effect_group>
            <passive_effect name="EntityDamage" operation="base_set" />
            <passive_effect name="BlockDamage" operation="base_set" value="20" />
        </effect_group>
    </item>
</items>

余白

今回は「setattribute/removeattribute」の簡単な使い方とその凡例を中心に解説してみました。

結構何をするにも使う機能で、「setattribute」に関しては他の機能と少しだけ書き方が違うので最初のうちは書き方を間違える(主に name=”value” 部分の書き忘れ)とは思いますが、頑張って慣れてください。

append」とこちらの機能を使うと、結構大胆なModletが作れるようになります。
今までは説明で基本的にアイテムに関して取り扱いましたが、「setattribute」を使うようになると一気に幅が広がり、特にUI関係の変更がやりやすくなります。

パッと思いついたので言うと、

  • 既存アイテムのレシピ内容修正
  • UIの表示位置や色などの情報の改ざん
  • 特定のゾンビの出現率の変更

等々、「〇〇を××に変えたい」みたいなのはあらかたできるかと思います。
何ができそうかを考えてみて実際に手を動かしてみるのが習得の近道でもあるのでコツコツ習得していきましょう。

コメント