XSL-группа по значению узла

У меня есть случай группировки ключей XSL. Цель состоит в том, чтобы заменить значение на основе совпадения идентификатора.

Входные данные:

<?xml version="1.0" encoding="UTF-8"?>
<root>
<message-in>
    <actions>
        <stop>
            <action id="33632">
                <text>DefaultComment</text>
                <planning-status>finished</planning-status>
                <realised-times>
                    <starttime>2017-03-13T12:43:54</starttime>
                    <finishtime>2017-03-13T13:15:21</finishtime>
                </realised-times>
            </action>
        </stop>
        <stop>
            <action id="33635">
                <planning-status>started</planning-status>
                <realised-times>
                    <starttime>2017-03-13T13:15:21</starttime>
                </realised-times>
            </action>
        </stop>
    </actions>
</message-in>
<output_getquerydata>
    <queries>
        <query name="fat">
            <parameters>
                <parameter name="id">33632</parameter>
            </parameters>
            <queryErrors/>
            <queryResults>
                <record id="1">
                    <column name="interfaceAction_externalId">33633OREA</column>
                </record>
            </queryResults>
        </query>
    </queries>
</output_getquerydata>
<output_getquerydata>
    <queries>
        <query name="fat">
            <parameters>
                <parameter name="id">33635</parameter>
            </parameters>
            <queryErrors/>
            <queryResults>
                <record id="1">
                    <column name="interfaceAction_externalId">536313OREA</column>
                </record>
            </queryResults>
        </query>
    </queries>
</output_getquerydata>
</root>

XSL:

<?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" indent="yes" omit-xml-declaration="no" encoding="utf-8"/>
<xsl:strip-space elements="*"/>
<xsl:key name="actionKey" match="stop" use="action/@id"/>
<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="/">
    <root>
        <xsl:copy-of select="//message-in"/>
    </root>
</xsl:template>
<xsl:template match="action/@id">
    <xsl:attribute name="id"><xsl:value-of select="substring-before(//output_getquerydata/queries/query/parameters/parameter[key('actionKey', @id)]/queryResults/record/column[@name='interfaceAction_externalId'],'OREA')"/></xsl:attribute>
</xsl:template>
</xsl:stylesheet>

У меня есть несколько узлов "действия", которые имеют соответствующие узлы "запроса". Цель состоит в том, чтобы для каждого идентификатора действия нам нужно было заменить значение идентификатора из тега "action" на соответствующее значение "interfaceAction_externalId". Таким образом, для идентификатора действия 33632 мы скопируем и заменим его значением "33633" (потому что у нас есть совпадение в parameneter/name/@id 33632 = action/@id).

Копия работает хорошо, я получаю всю информацию, которая мне нужна, но кажется, что action / @ id не заменяется. Я думал, что я буду использовать ключ, чтобы сохранить значения action / @ id, а затем использовать его в сопоставлении шаблона, чтобы заменить его значением interfaceAction_externalId, но это не работает, и я не уверен, что делаю неправильно.

Спасибо за вашу помощь!

1 ответ

Решение

Весь подход имеет смысл только если вы используете <xsl:apply-templates select="//message-in"/> вместо <xsl:copy-of select="//message-in"/>,

Что касается использования ключа, я думаю, что вы хотите

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="no" encoding="utf-8"/>
    <xsl:strip-space elements="*"/>
    <xsl:key name="ref-query"
        match="output_getquerydata/queries/query/queryResults/record/column[@name='interfaceAction_externalId']"
        use="ancestor::query/parameters/parameter[@name = 'id']"/>
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="/">
        <root>
            <xsl:apply-templates select="//message-in"/>
        </root>
    </xsl:template>
    <xsl:template match="action/@id">
        <xsl:attribute name="id"><xsl:value-of select="substring-before(key('ref-query', .),'OREA')"/></xsl:attribute>
    </xsl:template>
</xsl:stylesheet>
Другие вопросы по тегам