ключ xsl соответствует возвращаемому значению - PullRequest
0 голосов
/ 06 июня 2018

вход:

<DS>
<TL>
    <msg>
        <output_getquerydata>
            <queries>
                <query name="q1">
                    <parameters>
                        <parameter name="id">906OREA</parameter>
                    </parameters>
                    <results>
                        <record>
                            <column name="actionState">sdss</column>
                        </record>
                    </results>
                </query>
                <query name="q2">
                    <parameters>
                        <parameter name="resCode">CTL</parameter>
                        <parameter name="prodCode">89CMID</parameter>
                        <parameter name="pos">1,2,4,3</parameter>
                    </parameters>
                    <results>
                        <record id="1">
                            <column name="position">1</column>
                            <column name="ExternalProductId"/>
                        </record>
                        <record id="9">
                            <column name="position"/>
                            <column name="ExternalProductId">316442</column>
                        </record>
                    </results>
                </query>
                <query name="q2">
                    <parameters>
                        <parameter name="resCode">CTL</parameter>
                        <parameter name="prodCode">91VPRM</parameter>
                        <parameter name="pos">1,2,4,3</parameter>
                    </parameters>
                    <results>
                        <record id="1">
                            <column name="position"/>
                            <column name="ExternalProductId">316495</column>
                        </record>
                    </results>
                </query>
            </queries>
        </output_getquerydata>
    </msg>
    <TL>
        <ArticleNr>89CMID</ArticleNr>
    </TL>
    <TL>
        <ArticleNr>89CMID</ArticleNr>
    </TL>
    <TL>
        <ArticleNr>89CMID</ArticleNr>
    </TL>
    <TL>
        <ArticleNr>91VPRM</ArticleNr>
    </TL>
</TL>
</DS>

XSL:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="Article" match="tLoading" use="./ArticleNr"/>
<xsl:key name="prod" match="query[@name='q2']/results/record" use="./column[@name='ExternalProductId'][node()]"/>
<xsl:template match="DS">
    <msglist>
        <xsl:for-each select="./TL[./msg/output_getquerydata/queries/query/results/record/column[@name='actionState'] !='finished'] ">
            <xsl:variable name="distinctArticle" select="//TL[string(ArticleNr)][count(. | key('Article',ArticleNr)[1]) = 1]"/>
            <msg>
                <xsl:for-each select="$distinctArticle">
                    <load-part>
                    <!--I need here the value from column[@name='ExtPR'], that has parameter[@name='prodCode']=the current TL articleNr node.
                     -->
                        <productId>
                            <xsl:value-of select="key('prod',column[@name='ExternalProductId'])"/>
                        </productId>
                        <!--something-->
                    </load-part>
                </xsl:for-each>
            </msg>
        </xsl:for-each>
    </msglist>
</xsl:template>
</xsl:stylesheet>

Желаемый ВЫХОД:

<msglist>
<msg>
    <load-part>
        <productId>316442</productId>
    </load-part>
    <load-part>
        <productId>316442</productId>
    </load-part>
    <load-part>
        <productId>316442</productId>
    </load-part>
    <load-part>
        <productId>316495</productId>
    </load-part>
</msg>
</msglist>

Мне нужно в узле productID, значение из column[@name='ExternalProductId'], который имеет parameter[@name='prodCode']=the current <TL><ArticleNr> узел.Я знаю, что этот «для каждого» кода, который я поместил, возвращает только два значения, потому что я ищу разные значения, поэтому я думал, что попробую с ключом, но я не уверен, что яотсутствует.

Спасибо


отредактировано для правильных выходных значений

1 Ответ

0 голосов
/ 06 июня 2018

Во-первых, ваш ключ Article выглядит неправильно (в контексте вашего вопроса), поскольку в вашем XML нет элементов tLoading.Так и должно быть ...

<xsl:key name="Article" match="TL" use="ArticleNr"/>

Но чтобы ответить на ваш прямой вопрос, вам нужно определить свой ключ prod следующим образом:

<xsl:key name="prod" 
         match="query[@name='q2']/results/record" 
         use="../../parameters/parameter[@name='prodCode']"/>

Затем, чтобы найти его, сделайте это ...

 <xsl:value-of select="key('prod', ArticleNr)/column[@name='ExternalProductId']"/>

Или, может быть, так как у них запрос "q2" имеет два ExternalProductIds ...

<xsl:value-of select="key('prod', ArticleNr)/column[@name='ExternalProductId'][. != '']"/>

Попробуйте этот XSLT (который сохраняет вашу отдельную проверку,и так выводит только две строки)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />

<xsl:key name="Article" match="TL" use="ArticleNr"/>
<xsl:key name="prod" match="query[@name='q2']/results/record" use="../../parameters/parameter[@name='prodCode']"/>

<xsl:template match="DS">
    <msglist>
        <xsl:for-each select="./TL[./msg/output_getquerydata/queries/query/results/record/column[@name='actionState'] !='finished'] ">
            <xsl:variable name="distinctArticle" select="//TL[string(ArticleNr)][count(. | key('Article',ArticleNr)[1]) = 1]"/>
            <msg>
                <xsl:for-each select="$distinctArticle">
                    <load-part>
                        <productId>
                            <xsl:value-of select="ArticleNr" /> 
                            <xsl:text> - </xsl:text>
                            <xsl:value-of select="key('prod', ArticleNr)/column[@name='ExternalProductId'][. != '']"/>
                        </productId>
                    </load-part>
                </xsl:for-each>
            </msg>
        </xsl:for-each>
    </msglist>
</xsl:template>
</xsl:stylesheet>
...