比较数组中的元素值并获取父元素中的最大值元素

问题描述 投票:0回答:1

我正在尝试在 1.0 中创建一个 XSLT。请在下面找到一个示例 xml。要求是从所有 3 个字段中获取最大的 value1 字段并显示其中的标签。

请求XML:

<?xml version="1.0" encoding="UTF-8"?>
<GetTestValues xmlns="http://www.test.com/GetTestValues">
  <TestSample>
    <Test>
      <value1>10000</value1>
      <value2>2016-01-28</value2>
      <value3>2017-12-10T01:36:12.403+00:00</value3>
      <value4>US</value4>
      <value5>true</value5>
    </Test>
    <Test>
      <value1>30000</value1>
      <value2>2019-01-28</value2>
      <value3>2019-01-28T18:04:13.763+00:00</value3>
      <value4>Canada</value4>
      <value5>false</value5>
    </Test>
    <Test>
      <value1>50000</value1>
      <value2>2019-01-28</value2>
      <value3>2019-01-28T18:04:13.763+00:00</value3>
      <value4>Canada</value4>
      <value5>false</value5>
    </Test>
  </TestSample>
</GetTestValues>

改造后的预期反应:

请求XML:

<?xml version="1.0" encoding="UTF-8"?>
<GetTestValues xmlns="http://www.test.com/GetTestValues">
  <TestSample>
    <Test>
      <value1>50000</value1>
      <value2>2019-01-28</value2>
      <value3>2019-01-28T18:04:13.763+00:00</value3>
      <value4>Canada</value4>
      <value5>false</value5>
    </Test>
  </TestSample>
</GetTestValues>

我尝试放置 foreach,它显示了所有内容。不确定如何比较才能获得最大的价值。

<xsl:for-each select="/ns0:GetTestValues/ns0:TestSample/ns0:Test">
  <ns0:value1>
    <xsl:value-of select="ns0:value1"/>
  </ns0:value1>
  <ns0:value2>
    <xsl:value-of select="ns0:value2"/>
  </ns0:value2>
  <ns0:value3>
    <xsl:value-of select="ns0:value3"/>
  </ns0:value3>
  <ns0:value4>
    <xsl:value-of select="ns0:value4"/>
  </ns0:value4>
  <ns0:value5>
    <xsl:value-of select="ns0:value5"/>
  </ns0:value5>
</xsl:for-each>
xslt xslt-1.0 xslt-grouping
1个回答
0
投票

在此样式表中,我遍历

Test
元素集,按其
value1
子元素的降序排列(以便第一个
Test
元素具有最高的
value1
)。在
for-each
内部,我检查迭代的当前位置,如果它是
1
,那么我复制当前的
Test
元素;其他
Test
元素被忽略。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
    xmlns:test="http://www.test.com/GetTestValues">

    <xsl:output method="xml" indent="yes" />

    <!-- identity template -->
    <xsl:template match="@*|node()" name="identity">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>

    <!-- Select only the Test child whose value1 is greatest -->
    <xsl:template match="test:TestSample">
        <xsl:copy>
            <!-- iterate over the test child elements, in descending order of value1 -->
            <xsl:for-each select="test:Test">
                <xsl:sort select="test:value1" order="descending"/>
                <!-- copy the test element if it's the first (has the highest value1) -->
                <xsl:if test="position()=1">
                    <xsl:copy-of select="."/>
                </xsl:if>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>
© www.soinside.com 2019 - 2024. All rights reserved.