我有以下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之后完成。
答案 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"/>
虽然这也有效。