获取xsl中的最大计数值

时间:2015-05-16 10:45:43

标签: xml xslt

我有以下xml

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

我想要做的是从鳕鱼获得最大数量。在此示例中,代码300040出现3次,因此此代码具有最大出现次数。

这是我尝试做的事情:

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

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

请帮我解决一下。我的想法是我必须按计数排序,但问题是排序只能在for-each之后完成。

1 个答案:

答案 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"/>

虽然这也有效。