0

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

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

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

目前我有以下代码,它从所有 newP 对象返回 Max,而不是返回该 ddi 的最大值。我不确定如何做到这一点,请专家对此提出建议,有没有办法做到这一点。

我的预期输出应该是

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 中)是通过查找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 回答