построение строки XSLT с использованием переменной в цикле foreach - PullRequest
0 голосов
/ 20 декабря 2018

Проблема, с которой я сталкиваюсь, возможно, проста для других, но, будучи новичком в XSL, я еще не нашел правильного решения.То, что я хочу сделать, это построить строку путем объединения результатов переменных, определенных в цикле for-each.

Извините, это должно быть так:

<linked-hash-map>
<entry>
    <string>properties</string>
    <list>
        <linked-hash-map>
            <entry>
                <string>property_id</string>
                <int>123</int>
            </entry>
            <entry>
                <string>type</string>
                <string>H</string>
            </entry>
            <entry>
                <string>status</string>
                <string>CURRENT</string>
            </entry>
            <entry>
                <string>description</string>
                <string>Test</string>
            </entry>
            <entry>
                <string>lots</string>
                <list>
                    <linked-hash-map>
                        <entry>
                            <string>lot_id</string>
                            <int>123</int>
                        </entry>
                        <entry>
                            <string>lot_number</string>
                            <int>11</int>
                        </entry>
                        <entry>
                            <string>plan_number</string>
                            <int>100</int>
                        </entry>
                        <entry>
                            <string>plan_type</string>
                            <string>CC</string>
                        </entry>
                        <entry>
                            <string>plan_id</string>
                            <int>1</int>
                        </entry>
                    </linked-hash-map>
                </list>
            </entry>
        </linked-hash-map>
    </list>
</entry>

Желаемый вывод : SP - 31 - 108661

Так что в основном я хочу объединить plan_type , номер_Лота и plan_number вместе в одну строку.

Я пробовал это:

<xsl:for-each select="linked-hash-map/entry/linked-hash-map/entry/list/linked-hash-map/entry" >
    <xsl:choose>
        <!-- LOT NUMBER -->
        <xsl:when test="string[1] = 'lot_number'">
            <xsl:variable name="lot_number" select="int" />
        </xsl:when>
        <!-- PLAN NUMBER -->
        <xsl:when test="string[1] = 'plan_number'">
            <xsl:variable name="plan_number" select="int" />
        </xsl:when>
        <!-- PLAN TYPE -->
        <xsl:when test="string[1] = 'plan_type'">
            <xsl:variable name="plan_type" select="string[2]" />
        </xsl:when>
    </xsl:choose>
</xsl:for-each>

<!-- LOT DETAIL -->
// concatenate string in here.
<xsl:value-of select="concat($plan_type, '-', $lot_number, '-', $plan_number)" />

Но это не работает из-за того, что переменная выходит из области видимости.Как я могу достичь желаемого результата?Спасибо.

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

Чтобы изменить как можно меньше, попробуйте следующий код XSLT-1.0:

<xsl:template match="linked-hash-map">
    <xsl:variable name="plan_type" select="entry[string='plan_type']/string[2]/text()" />
    <xsl:variable name="lot_number" select="entry[string='lot_number']/int/text()" />
    <xsl:variable name="plan_number" select="entry[string='plan_number']/int/text()" />
    <xsl:value-of select="concat($plan_type, ' - ', $lot_number, ' - ', $plan_number)" /> 
</xsl:template> 

Его результат:

SP - 31 - 108661
0 голосов
/ 21 декабря 2018

У нас нет номера версии XSLT по этому вопросу, поэтому мне было интересно, что я напишу в 3.0.Возможно:

        <xsl:value-of select="for $n in ('plan_type', 'lot_number', 'plan_number') 
                              return entry[string[1]=$n]/*[2]" 
                      separator=" - "/>
0 голосов
/ 20 декабря 2018

Обратите внимание, что переменные являются локальными по объему для блока, в котором они объявлены, поэтому каждая переменная в этом случае будет доступна только в пределах xsl:when

Но вам не нужно xsl:for-eachили переменные здесь.Вы можете просто сделать что-то вроде этого (если вы используете шаблон, соответствующий linked-hash-map

<xsl:value-of select="concat(entry[string[1]='plan_type']/string[2], '-', entry[string[1]='lot_number']/int, '-', entry[string[1]='plan_number']/int)" />

Или, возможно, чтобы сделать его более читабельным, выделите строки

<xsl:value-of select="entry[string[1]='plan_type']/string[2]" />
<xsl:text>-</xsl:text>
<xsl:value-of select="entry[string[1]='lot_number']/int" />
<xsl:text>-</xsl:text>
<xsl:value-of select="entry[string[1]='plan_number']/int" />

См. http://xsltfiddle.liberty -development.net / eiZQaGs / 2

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