2015-05-16 2 views
0

У меня есть следующий XMLполучить максимальное значение счетчика в XSL

<?xml version="1.0"?> 
 
<!DOCTYPE nomenclator SYSTEM "nomenclator.dtd"> 
 
<?xml-stylesheet type="text/xsl" href="nomenclator.xsl"?> 
 
<nomenclator> 
 
\t <adresa cod="300368" tip="Strada"> 
 
\t \t <nume>St. Karadjic Vuc</nume> 
 
\t \t <alias cand="2008">Karadjici Vuk St</alias> 
 
\t </adresa> 
 
\t <adresa cod="300050" tip="Bulevard"> 
 
\t \t <nume>Miron Costin</nume> 
 
\t \t <alias cand="1990"> 12 Encsel Mauriciu</alias> 
 
\t </adresa> 
 
\t <adresa cod="300040" tip="Bulevard"> 
 
\t \t <nume>Miron Costin</nume> 
 
\t \t <alias cand="1990"> 12 Encsel Mauriciu</alias> 
 
\t </adresa> 
 
\t <adresa cod="300040" tip="Bulevard"> 
 
\t \t <nume>Miron Costin</nume> 
 
\t \t <alias cand="9"> 12 Encsel Mauriciu</alias> 
 
\t </adresa> 
 
</nomenclator>

То, что я хочу сделать, чтобы получить максимальное количество из трески. В этом примере код 300040 появляется в 3 раза, поэтому этот код имеет максимальное значение.

Вот что я пытался сделать:

<xsl:for-each select="nomenclator/adresa"> 
 
\t \t <xsl:call-template name="sortare"> 
 
\t \t \t <xsl:with-param name="param1" select="@cod"/> 
 
\t \t </xsl:call-template> 
 
\t </xsl:for-each> 
 

 
<xsl:template name="sortare"> 
 
\t <xsl:param name="param1" select="0"/> 
 
    <xsl:value-of select="count(document('nomenclator.xml')//adresa[@cod=$param1])"/>> 
 
</xsl:template>

Пожалуйста, помогите мне с решением. Идея состоит в том, что мне приходится сортировать по счету, но проблема в том, что сортировка может быть выполнена только после каждого.

+0

Я не уверен, что я понимаю ваш вопрос. Если вы хотите отсортировать узлы 'adresa' по их частоте, вам не нужно знать счетчик * максимум *. Было бы лучше, если бы вы показали нам ожидаемый результат. - P.S. Укажите XSLT 1.0 или 2.0. –

+0

Ожидаемый результат должен быть 300040, потому что этот код появляется два раза, а остальные только один раз. (XSLT 1.0) –

+0

Предполагается, что это будет ** ENTIRE ** результат преобразования XSL ?? Только эта часть данных? - ** P.S. Пожалуйста, укажите XSLT 1.0 или 2.0. ** –

ответ

0

Ожидаемый результат должен быть 300040, потому что этот код появляется два раз, а остальные только один раз.

Если это единственный результат, который вы ищете, оно может быть получено довольно просто:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:key name="adresa-by-cod" match="adresa" use="@cod" /> 

<xsl:template match="/nomenclator"> 
    <output> 
     <xsl:for-each select="adresa"> 
      <xsl:sort select="count(key('adresa-by-cod', @cod))" data-type="number" order="descending"/> 
      <xsl:if test="position()=1"> 
       <xsl:value-of select="@cod"/> 
      </xsl:if> 
     </xsl:for-each> 
    </output> 
</xsl:template> 

</xsl:stylesheet> 

Применительно к вашему примеру вход, в результат будет :

<?xml version="1.0" encoding="UTF-8"?> 
<output>300040</output> 

Обратите внимание на использование ключ, вместо:

<xsl:sort select="count(//adresa[@cod=current()/@cod])" data-type="number" order="descending"/> 

хотя это сработало бы, тоже.

+0

Спасибо, это было очень полезно! –

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