我试图从我的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>
答案 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, ' ')"/>
<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, ' MaxChre = ', chre, ' ')"/>
</xsl:if>
</xsl:for-each>
<xsl:value-of select="' '"/>
</xsl:template>
<xsl:template match="ddi">
<xsl:value-of select="concat('Number - ', Nmr, ' ')"/>
</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