我在不同的地方有一个带有不同名称标签的xml。我需要做的是,对所需的一个进行排序并获得它们的最大值。
输入XML:
<SUBSCRIBER>
<OnPeakAccountID>10</OnPeakAccountID>
<OnPeakSmsExpDate>**20640217172520**</OnPeakSmsExpDate>
<UnliSmsOnCtl>20140204173322</UnliSmsOnCtl>
<BucketMocOn>840</BucketMocOn>
<BucketMocOnExp>20140204173322</BucketMocOnExp>
<BucketMocTri>10000</BucketMocTri>
<BucketMocTriExp>**20140210235959**</BucketMocTriExp>
<UnliNxbFbcCtl>**20140210235959**</UnliNxbFbcCtl>
<BucketIM6VolFbc>10000</BucketIM6VolFbc>
<BucketIM6VolFbcExp>**20140210235959**</BucketIM6VolFbcExp>
<UnliEmail1FbcCtl>**20140210235959**</UnliEmail1FbcCtl>
<UnliIM2FbcCtl>**20140210235959**</UnliIM2FbcCtl>
<UnliPhoto1FbcCtl>**20140210235959**</UnliPhoto1FbcCtl>
<UnliSns1FbcCtl>**20140210235959**</UnliSns1FbcCtl>
<UnliBoost1FbcCtl>**20140210235959**</UnliBoost1FbcCtl>
<UnliBrws1FbcCtl>**20140210235959**</UnliBrws1FbcCtl>
</SUBSCRIBER>
例如,在上面的XML中,我需要从标有**&lt;&gt; **的元素中找到最大的值。说实话,我仍然在为逻辑而战,没有什么能在我的工作中发挥作用。任何帮助/建议将不胜感激。感谢您的支持。
答案 0 :(得分:1)
我想你想要这个模板:
<xsl:stylesheet version='1.0' xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="SUBSCRIBER">
<xsl:for-each select="OnPeakSmsExpDate|UnliSmsOnCtl|BucketMocOnExp|BucketMocTriExp|UnliNxbFbcCtl|BucketIM6VolFbcExp|UnliEmail1FbcCtl|UnliIM2FbcCtl|UnliPhoto1FbcCtl|UnliSns1FbcCtl|UnliBoost1FbcCtl|UnliBrws1FbcCtl">
<xsl:sort order="descending"/>
<xsl:if test="position() = 1">
<greatest><xsl:value-of select="."/></greatest>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:1)
XSLT 2.0
<xsl:template match="/SUBSCRIBER">
<max><xsl:value-of select="max((BucketMocTriExp, UnliNxbFbcCtl, BucketIM6VolFbcExp, UnliEmail1FbcCtl, UnliIM2FbcCtl, UnliPhoto1FbcCtl, UnliSns1FbcCtl, UnliBoost1FbcCtl, UnliBrws1FbcCtl))"/></max>
</xsl:template>
修改强>
要有条件地包含节点,请使用以下构造:
<xsl:value-of select="max((a, b, c, if(d > 0) then e else ())) "/>
答案 2 :(得分:0)
这个XSLT按降序对元素进行排序(在开始和结束时包含2个星号),并按照第一个排序:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="SUBSCRIBER">
<xsl:for-each select="*[starts-with(.,'**') and substring(.,string-length(.) - 1) = '**']">
<xsl:sort select="number(substring(substring(.,3),1,string-length(substring(.,3)) - 2))" order="descending"/>
<xsl:if test="position() = 1">
<xsl:value-of select="substring(substring(.,3),1,string-length(substring(.,3)) - 2)"/>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>