Голосование

Как вы оцениваете Смуту?












Оформление



Пользователей
  • Всего: 28884
  • Последний: Menfred
Сейчас на форуме
Пользователи: 1
Гостей: 709
Всего: 710

0 Пользователей и 1 Гость просматривают эту тему.

Тема: [BL] Использование XSLT  (Прочитано 1200 раз)

  • Сообщений: 691
  • За активную деятельность, связанную с публикациями и помощью другим посетителям
    • Просмотр профиля
+2
« : 28 Июля, 2023, 14:03 »
Тема для обсуждения использования XSLT применительно к Баннерлорду.
В руководстве по моддингу от TW использование XSLT описано на отшибись. Ниже рабочие примеры использования XSLT для замены, удаления и добавления атрибутов и элементов в игру. Разбирался сам на примере других модов и с помощью небезразличных товарищей с Дискорда. Я далек от программирования, но готов подсказать, что и зачем, в меру своих знаний.

Замена кода элемента в исходном xml на код в xml текущего мода на примере <Settlement ... > ... </Settlement> в файле settlements.xml.
ТРЕБУЕТСЯ СОЗДАНИЕ XML ФАЙЛА, в котором содержится новый код элемента.
Используется, если нужно заменить элемент целиком.
<xsl:template match="Settlement[@id='hideout_forest_1']"/>
СЛЕДУЮЩИЕ ЗАПИСИ НЕ ТРЕБУЮТ СОЗДАНИЯ XML ФАЙЛА, т.е. все изменения в исходный xml вносятся непосредственно через xslt.

Добавление отсутствующего атрибута "mother=" на примере <Hero ... /> в файле heroes.xml.
    <xsl:template match='Hero[@id="lord_goldenhorde_6_13"]'>
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:attribute name="mother">Hero.lord_goldenhorde_6_2</xsl:attribute>
            <xsl:apply-templates select="node()"/>
        </xsl:copy>
    </xsl:template>

Удаление атрибута "mother" в исходном xml на примере <Hero ... /> в файле heroes.xml.
    <xsl:template match="Hero[@id='lord_goldenhorde_6_10']/@mother" />
Замена атрибута "name" на примере <Settlement ... > ... </Settlement> в файле settlements.xml.
Я использую этот код, т.к. он самый короткий.
<xsl:template match="Settlement[@id='Golden_castle_village_K1_1']/@name">
<xsl:attribute name="name">{=Settlements.Settlement.name.ECM.Golden_castle_village_K1_1}Beshtau</xsl:attribute>
</xsl:template>

Замена атрибута "text" на примере <Settlement ... > ... </Settlement> в файле settlements.xml.
<xsl:template match="Settlement[@id='Golden_castle_village_K1_1']/@text">
<xsl:attribute name="text">{=Settlements.Settlement.text.castle_village_K1_1}The village of Beshtau (Five Mountains) is located at the foot of the five-domed mountain of the same name, after which the village is named. Local Circassians are engaged not only in breeding horses. They spend several months of the year raiding their neighbors, looting.</xsl:attribute>
</xsl:template>

Замена атрибута "village_type" на примере <Settlement ... > ... </Settlement> в файле settlements.xml.
<xsl:template match="Settlement[@id='Golden_castle_village_K1_1']/Components/Village/@village_type">
<xsl:attribute name="village_type">VillageType.steppe_horse_ranch</xsl:attribute>
</xsl:template>

Замена атрибута "name" на примере <NPCCharacter ... > ... </NPCCharacter>в файле lords.xml.
    <xsl:template match="NPCCharacter[@id='lord_goldenhorde_6_2']/@name">
        <xsl:attribute name="name">{=ECM_lord_goldenhorde_6_2}Boraqchin</xsl:attribute>
    </xsl:template>

Замена атрибута "age" в дочернем узле на примере <NPCCharacter ... > ... </NPCCharacter>в файле lords.xml.
    <xsl:template match="NPCCharacter[@id='lord_goldenhorde_6_2']/face/BodyProperties/@age">
        <xsl:attribute name="age">36</xsl:attribute>
    </xsl:template>

Замена нескольких одинаковых атрибутов "EquipmentSet" в дочернем узле на примере <NPCCharacter ... > ... </NPCCharacter>в файле lords.xml.
    <xsl:template match="NPCCharacter[@id='lord_goldenhorde_6_10']/Equipments">
        <Equipments>
  <EquipmentSet id="khu_bat_template_medium" />
  <EquipmentSet id="khu_civ_template_default" civilian="true" />
        </Equipments>
    </xsl:template>

Замена нескольких одинаковых атрибутов "name" в дочернем узле на примере <Culture ... > ... </Culture>в файле spcultures.xml.
    <xsl:template match="Culture[@id='empire']/clan_names">
        <clan_names>
  <name name="Acapanos" />
  <name name="Basileus" />
        </clan_names>
    </xsl:template>


Второй рабочий вариант кода для замены атрибутов. Я его не использую, т.к. он громоздкий. Возможно, у него есть доп. возможности, о которых я не знаю, т.к. не программист.

Замена атрибута "name" на примере <Settlement ... > ... </Settlement> в файле settlements.xml.
<xsl:template match="Settlement[@id='Golden_castle_K7']">
<Settlement>
<xsl:for-each select="@*">
<xsl:attribute name="{name()}">
<xsl:value-of select="." />
</xsl:attribute>
</xsl:for-each>
<xsl:attribute name="name">{=Settlements.Settlement.name.ECM.Golden_castle_K7}Hajji Tarkhan</xsl:attribute>
<xsl:apply-templates select="node()"/>
</Settlement>
</xsl:template>


Третий вариант кода для замены атрибутов. ВНИМАНИЕ! В этом варианте текстовое значение внутри кавычек нужно дополнительно заключать в '

Замена атрибута "name" на примере <Settlement ... > ... </Settlement> в файле settlements.xml.
<xsl:template match="Settlement[@id='Golden_castle_village_K1_1']/@name">
<xsl:attribute name="name">
<xsl:value-of select="'{=Settlements.Settlement.name.ECM.Golden_castle_village_K1_1}Beshtau'"/>
</xsl:attribute>
</xsl:template>

Замена атрибута "difficulty" на примере <Item ... /> ... </Item> в файле weapons.xml.
<xsl:template match="Item[@id='crossbow_f']/@difficulty">
<xsl:attribute name="difficulty">
<xsl:value-of select="75"/>
</xsl:attribute>
</xsl:template>

Замена атрибута "missile_speed" в дочернем узле на примере <Item ... /> ... </Item> в файле weapons.xml.
<xsl:template match="Item[@id='crossbow_f']/ItemComponent/Weapon/@missile_speed">
<xsl:attribute name="missile_speed">
<xsl:value-of select="102"/>
</xsl:attribute>
</xsl:template>
« Последнее редактирование: 28 Июля, 2023, 14:33 от potap »

СиЧЪ Total War СиЧЪ Total War
Сайт "Всадники Кальрадии" не является СМИ. Администрация не несет ответственность за высказывания и публикацию каких-либо материалов, сделанные любыми пользователями форума, в том числе посредством личных и публичных сообщений. Материалы, размещенные на ресурсе третьими лицами, могут содержать информацию, не предназначенную для лиц, не достигнувших совершеннолетия. При обнаружении на ресурсе материалов, нарушающих законодательство Российской Федерации, необходимо обращаться к администрации.
Сайт работает на быстром VPS/VDS хостинге от FASTVPS


Powered by SMF 2.0 | SMF © Simple Machines LLC