У меня проблема с использованием таблицы стилей 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>
Я хочу изменить "тип" элемента "Данные". Новый тип зависит от типа ссылочных элементов, что довольно проблематично для чтения. Способ найти тип указанного элемента выглядит следующим образом:
- найдите «DataVersion» с атрибутом «ObjRef» со значением атрибута «id» элемента «Data». Вы найдете DataVersion-element с «id = id2»
- , прочтите «O cc» - элемент с атрибутом «insRef», который равен значению «id» из «DataVersion» (id2) с ведущим хастагом. Вы найдете «O cc» с «id = id3»
- , прочтите первый идентификатор атрибута «oRefs» из O cc на шаге 3. Вы найдете «id4»
- прочтите «O cc», в котором «id» равно идентификатору из шага 3. Вы найдете O cc с id4
- прочтите «insRef» из O cc с id4 без хастага
- чтение элемента «DataVersion», где идентификатор атрибута равен значению шага 5. Вы найдете Dataversion id = «id6»
- считывание «типа» элемента из шага 6 и принятие решения на основе типа
- если тип равен «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>