XSLT 1.0: проанализировать изменение настроек - PullRequest
0 голосов
/ 06 октября 2011

У меня есть блок выборки данных в XML. Каждые данные имеют атрибут «switch», указывающий, выключен или выключен переключатель (значение по умолчанию выключено). Цель состоит в том, чтобы добавить эту информацию благодаря XSLT как атрибуту блока. Этот новый атрибут "action" указывает, был ли переключатель выключен или включен в блоке данных.

Дело 1:

<block>
    <data switch="true">2.4</data>  
    <data switch="true">2.4</data>
    <data>270.0</data>
    <data>244.79999999999998</data>
    <data>330.59999999999997</data>
</block>

преобразовано в

<block action="turnedOFF">
    <data switch="true">2.4</data>
    <data switch="true">2.4</data>
    <data>270.0</data>
    <data>244.79999999999998</data>
    <data>330.59999999999997</data>
</block>

Случай 2: обратное, xml ниже:

<block>
    <data>270.0</data>
    <data>244.79999999999998</data>
    <data>330.59999999999997</data>
    <data switch="true">2.4</data>
    <data switch="true">2.4</data>
</block>

должен быть преобразован в:

<block action="turnedON">
    <data>270.0</data>
    <data>244.79999999999998</data>
    <data>330.59999999999997</data>
    <data switch="true">2.4</data>
    <data switch="true">2.4</data>
</block>

1 Ответ

1 голос
/ 06 октября 2011

Если вы знаете, что может быть не более одного перехода атрибута switch в элементах <data>, этого должно быть достаточно, чтобы проверить значения первого и последнего элемента <data> в <block>. Вот непроверенная попытка:

<?xml version="1.0" encoding="utf-8"?>

<xsl:template match="block">
    <block>
        <xsl:if test="data[1]/@switch and not(data[last()]/@switch)">
            <xsl:attribute name="action">turnedOFF</xsl:attribute>
        </xsl:if>
        <xsl:if test="not(data[1]/@switch) and data[last()]/@switch">
            <xsl:attribute name="action">turnedON</xsl:attribute>
        </xsl:if>
        <xsl:apply-templates select="@*|node()" />
    </block>
</xsl:template>

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

Обновление Я исправил несколько ошибок и проверил преобразование. Это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...