2017-02-08 4 views
1

Я новичок в XSLT 1.0, поэтому, пожалуйста, извините меня за плохое качество кодирования. Я пытаюсь подсчитать записи, содержащие строку, например «fee» в xsl: key. В то время как это работает xsl:value-of select="count(//Comments[contains(., 'Fee')])", он применяет счет для всех отдельных записей. Как подсчитать записи, содержащие строку, относящуюся к элементу ReferralDesc.Использование функции с ключом xsl:

OUTPUT (в настоящее время)

Referral Count Days Days CntInfo 
Architect 9 794  88.2  1 
Building 26 1784 68.6  1 
Trees 6 548  91.3  1 

XML

<Referrals> 
    <Referral> 
     <ApplicationId>51240</ApplicationId> 
     <Proposal>Demolition work</Proposal> 
     <ReferralDesc>Architect</ReferralDesc> 
     <Lapsed>49</Lapsed> 
     <Officer>Mark What</Officer> 
     <Comments>Information provided</Comments> 
    </Referral> 
    <Referral> 
     <ApplicationId>51304</ApplicationId> 
     <Proposal>Alterations and Additions</Proposal> 
     <ReferralDesc>Tree</ReferralDesc> 
     <Lapsed>28</Lapsed> 
     <Officer>Mark Some</Officer> 
     <Comments>Fee quoted</Comments> 
    </Referral> 
</Referrals> 

XSLT

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:key name="groups" match="Referral" use="ReferralDesc" /> 
<xsl:key name="info" match="Referral" use="normalize-space(Comments)" /> 
<xsl:key name="days" match="Referral" use="Lapsed" /> 

<xsl:template match="NewDataSet"> 

    <table style="width:55%; font-size:10px;"> 
    <thead> 
     <th style="width:25%" class="borders">Referral</th> 
     <th style="width:10%" class="borders">Count</th> 
     <th style="width:10%" class="borders">Days total</th> 
     <th style="width:10%" class="borders">Days avg</th> 
     <th style="width:10%" class="borders">CntInfo</th> 
    </thead> 

    <xsl:for-each select="Referrals/Referral[count(. | key('groups', ReferralDesc)[1]) = 1]"> 
    <xsl:sort select="ReferralDesc" /> 
     <tr> 
     <td class="borders"> 
      <xsl:value-of select="ReferralDesc" /> 
     </td> 
     <td class="borders"> 
      <xsl:value-of select="count(. | key('groups', ReferralDesc))"/> 
     </td> 
     <td class="borders"> 
      <!-- <xsl:value-of select="sum(Lapsed)"/> --> 
      <xsl:value-of select="sum(key('groups',ReferralDesc)/Lapsed)"/> 
     </td> 
     <td class="borders"> 
      <xsl:variable name="nRef"> 
      <xsl:value-of select="count(. | key('groups', ReferralDesc))"/> 
      </xsl:variable> 
      <xsl:variable name="sDay"> 
      <xsl:value-of select="sum(key('groups',ReferralDesc)/Lapsed)"/> 
      </xsl:variable> 
      <xsl:value-of select="format-number($sDay div $nRef, '###,###.0')"/> 
     </td> 
     <td class="borders"> 
      <xsl:value-of select="count(//Comments[contains(., 'fee')])" /> 
     </td> 
     </tr> 
    </xsl:for-each> 

    </table> 
</xsl:template> 
</xsl:stlyesheet> 

ОТВЕТ

Похоже упорства окупается. обновленный ключ(). б XSL: Имя ключа = "Информация" матч = "Направление [содержит (./ Комментарии, 'плата')]" использовать = "ReferralDesc"

ответ

0

Выражение вы хотите, это ....

<xsl:value-of select="count(key('groups', ReferralDesc)/Comments[contains(., 'fee')])" /> 

Как и в сторону, это выражение в вашем XSLT ....

<xsl:value-of select="count(. | key('groups', ReferralDesc))"/> 

Может быть несколько упрощена, чтобы именно это (потому что вы уже знаете, что текущий узел является частью текущего ключа)

<xsl:value-of select="count(key('groups', ReferralDesc))"/> 
+0

Спасибо, Тим С оценит ваш ответ. – Xtronic