Наследование файлов XML и изменение значений - PullRequest
1 голос
/ 01 апреля 2012

Это вопрос о концепции .

У меня есть XML файл, назовем его base :

<base id="default">
    <tags>
        <tag>tag_one</tag>
        <tag>tag_two</tag>
        <tag>tag_three</tag>
    </tags>
    <data>
        <data_a>blue</data_a>
        <data_b>3</data_b>
    </data>
</base>

Я хочу расширить этот XML в другом файле, изменяя отдельные свойства.Например, я хочу унаследовать этот файл и создать новый с другим data/data_a узлом:

<base id="green" import="default">
    <data>
        <data_a>green</data_a>
    </data>
</base>

Пока все довольно просто, он заменяет старый data/data_a с новым.Я даже могу добавить новый узел:

<base id="ext" import="default">
    <moredata>
        <data>extended version</data>
    </moredata>
</base>

И все же это довольно просто.Проблема возникает, когда я хочу удалить узел или иметь дело со списками XML (например, узел tags).

Как мне ссылаться на определенный индекс в списке?Я думал сделать что-то вроде:

<base id="diffList" import="default">
    <tags>
        <tag index="1">this is not anymore tag_two</tag>
    </tags>
</base>

И для удаления индекса узла / массива:

<base id="deleting" import="default">
    <tags>
        <tag index="2"/>
    </tags>
    <data/>
</base>

<!-- This will result in an XML containing these values: -->

<base>
    <tag>tag_one</tag>
    <tag>tag_two</tag>
</base>

Но я не доволен своими решениями.Я ничего не знаю о XSLT или других инструментах преобразования XML, но я думаю, что кто-то должен был сделать это раньше.

Цель key , которую я ищу, - это простота написания XMLвручную (как базовое, так и «расширенное» ).

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

Спасибодля чтения.

1 Ответ

1 голос
/ 01 апреля 2012

Ниже может помочь вам.XSLT может преобразовать один XML в другой.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="data_a">
        <data_a>green</data_a>
    </xsl:template>

    <xsl:template match="tags/tag[1]"/>

</xsl:stylesheet>

Объяснение трех шаблонов, приведенных выше:
(1) скопировать все узлы и атрибуты
(2), но изменить узел data_a
(3) и ничего не делать для первого элемента тега в (любом) элементе тегов.

Надеюсь, это поможет вам преобразовать ваш XML.

...