2014-02-20 3 views
0

У меня есть xml с разными тегами имен в разных местах. То, что мне нужно сделать, это сортировать необходимый и получить максимальное значение.Самое большое число из тегов в 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, мне нужно найти наибольшее значение из элементов, отмеченных ** <> **. Честно говоря, я все еще борюсь за логику, и ничто не работает в моем конце. Любая помощь/предложения будут оценены. Спасибо за поддержку.

+0

Можете ли вы показать нам пример того, как это должно работать. Я имею в виду только нормальное теоретическое объяснение того, какое число должно быть показано в приведенном выше примере, и как/почему – user2423959

+0

«* наибольшее значение из элементов, помеченных символом ** **>. *« Предположительно, они не будут отмечены так что в реальном вкладе - так что отличает их от других? Или у вас есть список элементов, которые необходимо учитывать? –

+0

Мне нужно максимальное значение из значений тегов BucketMocTriExp, UnliNxbFbcCtl, BucketIM6VolFbcExp, UnliEmail1FbcCtl, UnliIM2FbcCtl, UnliPhoto1FbcCtl, UnliSns1FbcCtl, UnliBoost1FbcCtl и UnliBrws1FbcCtl. Чтобы идентифицировать теги, я дал ** этим элементам, но реальный вход не имеет маркировки. Количество тегов может варьироваться от xml до xml, но подмножество тех, которые я определил в примере. – Hari

ответ

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> 
+0

хороший. Большое спасибо. – Hari

+0

Еще одна точка. В данном вводе, если значение BucketMocTri больше нуля, тогда мне нужно учитывать значение тега BucketMocTriExp при нахождении max. Пожалуйста, не могли бы вы мне помочь. – Hari

0

Это XSLT сортирует элементы со значением (содержащие 2 звездочки в начале и на конце), в порядке убывания и extrats первый:

<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> 
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> 

EDIT:

Чтобы включить узел условно, используйте следующую конструкцию:

<xsl:value-of select="max((a, b, c, if(d > 0) then e else())) "/> 
+0

Спасибо, Майкл. Еще одна услуга, например, если значение тега BucketIM6VolFbc больше нуля, тогда мне нужно рассмотреть тег BucketIM6VolFbcExp в функции max. Как я могу достичь этого сценария в вашем коде? Пожалуйста, совет – Hari

+1

@Hari См. Мое редактирование выше. –

Смежные вопросы