0

私のddiがrefddiNmrと一致し、名前に「アクティブ」が含まれていない値のグループから最大料金を取得しようとしていました

複数の ddi オブジェクトがあり、ddi 名は「PH」、「FX」などにすることができます。「PH」ddiごとに、名前に「アクティブ」が含まれていない「newP」オブジェクトから最大料金と名前を取得したい

for ループやその他のオプションを使用して複数の xsl コードを記述しようとしましたが、結果が得られなかったために for ループを削除することになりました。

現在、そのddiの最大値を返すのではなく、すべてのnewPオブジェクトから最大値を返す次のコードがあります。これを達成する方法がわかりません。これに関する提案を専門家に依頼します。これを行う方法はありますか。

私の期待される出力は

Number- 90004    
Name        =   SM 10 P  
MaxChre     =   39.99 < ! -- Max value within 90004 group-->

Number- 30010 < !-- this should not come because its not of name "PH"-->

Number- 30011   
Name        =   SBB 15 FX     
MaxChre     =   40.0  < ! -- Max value within 30011 group-->

Number- 30012    
Name        =   VEI    
MaxChre     =   41.0  < ! -- Max value within 30012 group-->

質問のインデントについてお詫び申し上げます。コードとデータの詳細は次のとおりです。

私のバギーコード:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:date="http://exslt.org/dates-and-times"  extension-element-prefixes="date" xmlns:math="http://exslt.org/math"  version="1.0">
<xsl:output method="xml" encoding="utf-8" indent="no"/>
    <xsl:template match="/">
            <xsl:variable name="New" select="/SM/xml_data/emData" />
            <xsl:for-each select="/SM/xml_data/emData/ddi">
        Number- <xsl:value-of select="Nmr"/>
                 <xsl:if test="name='PH'">
        Amount- <xsl:value-of select="math:max(/SM/xml_data/emData/newP[contains(refddiNmr,Nmr)]/chre)"/>
        Name- <xsl:value-of select="/SM/xml_data/emData/newP/name"/>
                </xsl:if> 
            </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

サンプルデータ:

    <SM>
    <xml_data>
    <emData>
        <ddi>
            <Nmr>90004</Nmr>
            <name>PH</name>
        </ddi>
        <ddi>
            <Nmr>30010</Nmr>
            <name>FA</name>
        </ddi>
        <ddi>
            <Nmr>30011</Nmr>
            <name>PH</name>
        </ddi>
        <ddi>
            <Nmr>30012</Nmr>
            <name>PH</name>
        </ddi>
        <newP>
            <start>2012-03-30</start>
            <name>VAF - Active</name>
            <chre>29.99</chre>
            <refddiNmr>90004</refddiNmr>
        </newP>
        <newP>
            <start>2012-03-30</start>
            <name>VAFD - Active</name>
            <chre>-29.99</chre>
            <refddiNmr>90004</refddiNmr>
        </newP>
        <newP>
            <start>2012-03-30</start>
            <name>SM 10 P</name>
            <chre>39.99</chre>
            <refddiNmr>90004</refddiNmr>
        </newP>
        <newP>
            <start>2012-03-30</start>
            <name>VE-I</name>
            <chre>10.0</chre>
            <refddiNmr>90004</refddiNmr>
        </newP>
        <newP>
            <start>2012-03-30</start>
            <name>SBB 15 FX</name>
            <chre>40.0</chre>
            <refddiNmr>30011</refddiNmr>
        </newP>
        <newP>
            <start>2012-03-30</start>
            <name>FXA - Active</name>
            <chre>9.99</chre>
            <refddiNmr>30011</refddiNmr>
        </newP>
        <newP>
            <start>2012-03-30</start>
            <name>FAD - Active</name>
            <chre>-9.99</chre>
            <refddiNmr>30011</refddiNmr>
        </newP>
        <newP>
            <start>2012-03-30</start>
            <name>VEI</name>
            <chre>40.0</chre>
            <refddiNmr>30011</refddiNmr>
        </newP>
        <newP>
            <start>2012-03-30</start>
            <name>SBB 15 FXA</name>
            <chre>90.0</chre>
            <refddiNmr>30010</refddiNmr>
        </newP>
        <newP>
            <start>2012-03-30</start>
            <name>FXA - Active</name>
            <chre>9.99</chre>
            <refddiNmr>30010</refddiNmr>
        </newP>
        <newP>
            <start>2012-03-30</start>
            <name>FAD - Active</name>
            <chre>-9.99</chre>
            <refddiNmr>30010</refddiNmr>
        </newP>
        <newP>
            <start>2012-03-30</start>
            <name>VEI</name>
            <chre>45.0</chre>
            <refddiNmr>30010</refddiNmr>
        </newP>
        <newP>
            <start>2012-03-30</start>
            <name>SBB 15 FXB</name>
            <chre>40.0</chre>
            <refddiNmr>30012</refddiNmr>
        </newP>
        <newP>
            <start>2012-03-30</start>
            <name>FXB - Active</name>
            <chre>9.99</chre>
            <refddiNmr>30012</refddiNmr>
        </newP>
        <newP>
            <start>2012-03-30</start>
            <name>FAD - Active</name>
            <chre>-9.99</chre>
            <refddiNmr>30012</refddiNmr>
        </newP>
        <newP>
            <start>2012-03-30</start>
            <name>VEI</name>
            <chre>41.0</chre>
            <refddiNmr>30012</refddiNmr>
        </newP>
    </emData>
    </xml_data>
    </SM>
4

1 に答える 1

0

これを (XSLT 1.0 で) 実現する 1 つの方法は、キーを使用してnewP要素を検索することです。

<xsl:key name="ref" match="newP[not(contains(name, 'active'))]" use="refddiNmr"/>

次に、一致する各ddi要素について、キーの最初の要素をchre値で並べ替えて見つけることができます...

<xsl:for-each select="key('ref', Nmr)">
   <xsl:sort select="chre" order="descending" data-type="number"/>
   <xsl:if test="position() = 1">
      ... Maximum value...

ここに完全な XSLT があります

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

   <xsl:key name="ref" match="newP[not(contains(name, 'active'))]" use="refddiNmr"/>

   <xsl:template match="/">
      <xsl:apply-templates select="//ddi"/>
   </xsl:template>

   <xsl:template match="ddi[name='PH']">
      <xsl:value-of select="concat('Number - ', Nmr, '&#13;')"/>
      <xsl:for-each select="key('ref', Nmr)">
         <xsl:sort select="chre" order="descending" data-type="number"/>
         <xsl:if test="position() = 1">
            <xsl:value-of select="concat('Name - ', name, '&#13;MaxChre = ', chre, '&#13;')"/>
         </xsl:if>
      </xsl:for-each>
      <xsl:value-of select="'&#13;'"/>
   </xsl:template>

   <xsl:template match="ddi">
      <xsl:value-of select="concat('Number - ', Nmr, '&#13;&#13;')"/>
   </xsl:template>
</xsl:stylesheet>

サンプル XML に適用すると、次のように出力されます。

Number - 90004
Name - SM 10 P
MaxChre = 39.99

Number - 30010

Number - 30011
Name - SBB 15 FX
MaxChre = 40.0

Number - 30012
Name - VEI
MaxChre = 41.0
于 2012-04-03T22:10:27.100 に答える