Тег запроса XSL на основе значения - PullRequest
0 голосов
/ 09 мая 2018

Ввод XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <output>
        <calls>
            <call>
                <parameters>
                    <parameter name="id">CTL-000002</parameter>
                </parameters>
                <Results>
                    <ex id="1">
                        <column name="CFGCapacity">9500.0000000</column>
                        <column name="CFGCode">CTL-3819</column>
                        <column name="CPCode">CTL-3819-01</column>
                        <column name="CPCapacity">2700</column>
                        <column name="unit">gallon</column>
                    </ex>
                    <ex id="2">
                        <column name="CFGCapacity">52120.0000000</column>
                        <column name="CFGCode">CTL-3819</column>
                        <column name="CPCode">CTL-3819-01</column>
                        <column name="CPCapacity">22950</column>
                        <column name="unit">pound</column>
                    </ex>
                    <ex id="3">
                        <column name="CFGCapacity">9500.0000000</column>
                        <column name="CFGCode">CTL-3819</column>
                        <column name="CPCode">CTL-3819-02</column>
                        <column name="CPCapacity">1700</column>
                        <column name="unit">gallon</column>
                    </ex>
                </Results>
            </call>
        </calls>
    </output>
    <plant>
        <id>CTL-000002</id>
        <plant_tag>0</plant_tag>
    </plant>
</root>

XSL:

<xsl:template match="@* | node()">
    <root>
        <xsl:for-each select="//plant">
            <xsl:choose>
                <xsl:when test="plant_tag='0'">
                    <cfgs>
                        <cfg>
                            <id>
                                <xsl:value-of select="//root/output/calls/call/parameters[parameter[@name='id'] = ./id]/../../Results/ex/column[@name='CFGCode']"/>
                            </id>
                        </cfg>
                    </cfgs>
                    <xsl:copy-of select="."/>
                </xsl:when>
                <xsl:otherwise>
                    <!--smthing else-->
                </xsl:otherwise>
            </xsl:choose>
        </xsl:for-each>
    </root>
</xsl:template>
</xsl:stylesheet>

Я не уверен, что делаю неправильно.
В основном, я хочу вставить в тег cfg / idзначение из столбца с именем 'CFGCode'.Хитрость в том, что у меня могут быть разные «вызовы» с разными параметрами, поэтому я хочу убедиться, что я заполнил тэг ID правильным значением, поэтому я пытаюсь сопоставить завод / ID с параметром [name = 'id'] из звонка.Если эти значения совпадают, выберите значение из CFGCode.

Конечная цель заключается в том, чтобы у меня было несколько тегов 'растений' с различной информацией, и мне нужно сопоставить идентификатор завода с идентификатором из 'call ', чтобы выбрать некоторую информацию из результатов моего вызова (это некоторые результаты запроса).

Спасибо!

Редактировать:

Ожидаемый результат:

<root>
<plant>
    <cfgs>
        <cfg>
            <id>CTL-3819</id>
        </cfg>
    </cfgs>
    <id>CTL-000002</id>
    <plant_tag>0</plant_tag>
</plant>
</root>

1 Ответ

0 голосов
/ 09 мая 2018

Вы хотите получить следующее выражение ...

<xsl:value-of select="//root/output/calls/call/parameters[parameter[@name='id'] = current()/id]/../Results/ex/column[@name='CFGCode']"/>

Обратите внимание на использование current()/id вместо ./id, так как current() относится к текущему узлу plant, тогда как . в условии xpath будет относиться к узлу parameter.

Также обратите внимание, что вам нужно было сделать .. вместо ../...

Однако вы можете упростить выражение до этого ...

<xsl:value-of select="//root/output/calls/call[parameters/parameter[@name='id'] = current()/id]/Results/ex/column[@name='CFGCode']"/>

Или еще лучше определить ключ так ...

<xsl:key name="calls" match="call" use="parameters/parameter[@name='id']" />

Тогда вы можете сделать это ...

<xsl:value-of select="key('calls', id)/Results/ex/column[@name='CFGCode']"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...