цикл / итерация в xml с XSLT - PullRequest
0 голосов
/ 10 января 2020

У меня есть xml, как показано ниже,

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

<recConfig>
    <drecipe>
        <id>2</id>
        <name>BREAD </name>
        <description>           </description>
        <accesslevel>  operator </accesslevel>  
            <parameter>     
            <parameterValue>    test1</parameterValue>
            <parameterValue>    test2</parameterValue>
            <parameterValue>    test3</parameterValue>
        </parameter>

    </drecipe>

</recConfig>

Я хочу перевести его в op, как показано ниже с помощью xslt OP NEEDED:


('2','operator', 'test1')
('2','operator','test2')
('2','operator','test3')

Я могу генерировать до

('2','operator')
('2','operator')
('2','operator')

Я делаю что-то не так, у меня ниже xslt, я действительно новичок в XSLT и Xpath, любые рекомендации очень ценятся


<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8" indent="yes" />

<xsl:template match="/recConfig">

    <xsl:for-each select="drecipe">
        <xsl:variable name="id" select="id" />
        <xsl:variable name="accesslevel" select="accesslevel" />
        <xsl:for-each select="parameter/*">
        <xsl:variable name="parameterValue" select="parameterValue" />
            <xsl:text>(</xsl:text>

            <xsl:for-each select="$id | $accesslevel  | $parameterValue">
                <xsl:text>'</xsl:text>
                <xsl:value-of select="normalize-space(.)"/>
                <xsl:text>'</xsl:text>
                <xsl:if test="position() != last()">
                    <xsl:text>,</xsl:text>
                </xsl:if>
            </xsl:for-each>   
            <xsl:text>)&#10;</xsl:text>
        </xsl:for-each>   
  </xsl:for-each>    
</xsl:template>

</xsl:stylesheet>


Я полагаю, что эта часть должна итерация по каждому дочернему узлу параметра

<xsl:for-each select="parameter/*">

И эта часть для чтения каждого значения параметра в переменную parameterValue

        <xsl:variable name="parameterValue" select="parameterValue" />

Заранее спасибо

1 Ответ

0 голосов
/ 12 января 2020

При выполнении XSLT старайтесь придерживаться «соответствия шаблону» (функционал) и для go использования for-each (процедурный)

По вашему вопросу:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="text" encoding="UTF-8" indent="yes" />

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

<xsl:template match="parameterValue">
    <xsl:text>(</xsl:text>
    <xsl:value-of select='normalize-space(../../id/text())'/>
    <xsl:text>,</xsl:text>
    <xsl:value-of select='normalize-space(../../accesslevel/text())'/>
    <xsl:text>,</xsl:text>
    <xsl:value-of select='normalize-space(text())'/>
    <xsl:text>)&#10;</xsl:text>
</xsl:template>

</xsl:stylesheet>

выводит желаемое:

(2, оператор, test1)

(2, оператор, test2)

(2, оператор, test3)

Надеюсь, это поможет.

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