манипуляция XML файл с таблицей стилей. изменять значение атрибутов в зависимости от ссылочных позиций - PullRequest
0 голосов
/ 29 мая 2020

У меня проблема с использованием таблицы стилей xml. Надеюсь, таблица стилей удовлетворит мои требования. Используя таблицу стилей, я хочу различными способами манипулировать файлом XML. Все работает нормально, кроме одного требования. Файл XML выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<Top>
    <Data id="id1" type="defaultType" />
    <DataVersion id="id2" type="otherType"  ObjRef="#id1"/>
    <DataVersion id="id6" type="yetAnotherType"/>
    <Graph>
        <Occ id="id3" insRef="#id2" oRefs="id4 id5"/>
        <Occ id="id4" insRef="#id6"/>
    </Graph>
</Top>

Я хочу изменить "тип" элемента "Данные". Новый тип зависит от типа ссылочных элементов, что довольно проблематично для чтения. Способ найти тип указанного элемента выглядит следующим образом:

  1. найдите «DataVersion» с атрибутом «ObjRef» со значением атрибута «id» элемента «Data». Вы найдете DataVersion-element с «id = id2»
  2. , прочтите «O cc» - элемент с атрибутом «insRef», который равен значению «id» из «DataVersion» (id2) с ведущим хастагом. Вы найдете «O cc» с «id = id3»
  3. , прочтите первый идентификатор атрибута «oRefs» из O cc на шаге 3. Вы найдете «id4»
  4. прочтите «O cc», в котором «id» равно идентификатору из шага 3. Вы найдете O cc с id4
  5. прочтите «insRef» из O cc с id4 без хастага
  6. чтение элемента «DataVersion», где идентификатор атрибута равен значению шага 5. Вы найдете Dataversion id = «id6»
  7. считывание «типа» элемента из шага 6 и принятие решения на основе типа
  8. если тип равен «stillAnotherType», напишите «YET», иначе напишите «customType»

вот моя первая попытка решить эту проблему, которая, я думаю, не очень успешна. Может быть, у вас есть подсказка, как решить эту проблему, и если таблица стилей является правильным способом решения этой проблемы.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Data/@type">
        <xsl:attribute name="type">

            <!-- not complete but first try -->
            <xsl:when test="//Occ[insRef='#//DataVersion[ObjRef='#..[id]'']@oRefs[1]] = 'yetAnotherType'">
                <xsl:value-of select="'YET'"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="'customType'"/>
            </xsl:otherwise>

        </xsl:attribute>
    </xsl:template>
</xsl:stylesheet>
...