我正在尝试在 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>
在此样式表中,我遍历
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>