来自一组样本值的XSL最大值不起作用

时间:2012-04-03 21:07:49

标签: xml xslt

我试图从我的ddi与refddiNmr匹配且名称不包含“Active”的值组中获取MAX费用

我有多个ddi对象,ddi名称可以是“PH”,“FX”等;现在对于每个“PH”ddi,我想从“newP”对象中获取最大费用和名称,其中Name不包含“Active”

我尝试用for循环和其他选项编写多个xsl代码,最后我逐渐删除了我的for循环因为他们没有给我任何结果。

目前我有以下代码,它从所有newP对象返回Max,而不是返回该ddi的max。 我不知道如何做到这一点,请求专家就此提出建议,是否有办法做到这一点。

我的预期输出应为

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-->

对问题中的缩进道歉。以下是代码和数据的其他详细信息:

My Buggy CODE:

<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>

1 个答案:

答案 0 :(得分:0)

实现这一目标的一种方法(在XSLT 1.0中)是通过一个键来查找 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