xsl键匹配以返回特定值

时间:2018-06-06 11:40:17

标签: xslt-1.0

输入:

<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 :(得分:0)

首先,由于XML中没有Article元素,因此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>