这是xml文件:
<sinonime>
<cuvant titlu="timp">
<definitie>durata care corespunde desfasurarii unui evenimen</definitie>
<sens>vreme</sens>
<sens>sezon</sens>
<sens>durata</sens>
</cuvant>
<cuvant titlu="harnic">
<definitie>care munceste mult, repede si cu folos</definitie>
<sens>muncitor</sens>
<sens>sarguincios</sens>
</cuvant>
<cuvant titlu="Enervat">
<definitie>scos din fire, in stare de iritare</definitie>
<sens>nervos</sens>
</cuvant>
<cuvant titlu="parfum">
<definitie>ceva cu miros placut, frumos</definitie>
<sens>mireasma</sens>
<sens>esenta</sens>
<sens>miros</sens>
<sens>colonie</sens>
</cuvant>
<cuvant titlu="Eprubeta">
<definitie>tub de sticla inchis la capat</definitie>
<sens>tub</sens>
</cuvant>
<cuvant titlu="medicament">
<definitie>substanta utilizata pentru a vindeca, ameliora sau preveni o boala</definitie>
<sens>elixir</sens>
<sens>leac</sens>
<sens>remediu</sens>
</cuvant>
</sinonime>
&#13;
我期待输出:
Enervat
Eprubeta
因为那些只有一个感觉的元素(子元素的最小数量&#39; sens&#39;)
如何返回哪些元素具有min子元素?
我试过了:
<xsl:for-each select="sinonime/cuvant">
<xsl:sort select="count(document('sinonime.xml')//cuvat/sens)"/>
<xsl:if test="position()=last()">
<xsl:value-of select="@titlu"/>
</xsl:if>
</xsl:for-each>
&#13;
答案 0 :(得分:0)
使用问题中的for-each
循环,您只能获得具有最小sens
个节点数的1个元素。你可以,例如使用第一个for-each
获取最小计数,然后打印所有titlu
个节点的cuvant
属性值,其最小计数如下:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:template match="sinonime">
<xsl:variable name="min">
<xsl:for-each select="cuvant">
<xsl:sort select="count(sens)" data-type="number" order="ascending"/>
<xsl:if test="position()=1">
<xsl:value-of select="count(sens)"/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:for-each select="cuvant[count(sens)=$min]">
<xsl:value-of select="@titlu"/>
<xsl:if test="position() != last()">
<xsl:text>
</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:transform>
当应用于输入时,会产生输出
Enervat
Eprubeta
答案 1 :(得分:0)
您可以通过首先创建一个包含每个&#34; cuvant&#34;的计数和名称的简单文档来轻松解决此问题,例如:
<counts>
<count name="timp" n="3"/>
<count name="harnic" n="2"/>
...
</counts>
从那里很容易得到最小值,选择@n
最小的所有值,并正确显示它们(这是一个完整的例子,有趣的部分是最后2个模板):
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:variable name="doc" as="element()">
<sinonime>
<cuvant titlu="timp">
<definitie>durata care corespunde desfasurarii unui evenimen</definitie>
<sens>vreme</sens>
<sens>sezon</sens>
<sens>durata</sens>
</cuvant>
<cuvant titlu="harnic">
<definitie>care munceste mult, repede si cu folos</definitie>
<sens>muncitor</sens>
<sens>sarguincios</sens>
</cuvant>
<cuvant titlu="Enervat">
<definitie>scos din fire, in stare de iritare</definitie>
<sens>nervos</sens>
</cuvant>
<cuvant titlu="parfum">
<definitie>ceva cu miros placut, frumos</definitie>
<sens>mireasma</sens>
<sens>esenta</sens>
<sens>miros</sens>
<sens>colonie</sens>
</cuvant>
<cuvant titlu="Eprubeta">
<definitie>tub de sticla inchis la capat</definitie>
<sens>tub</sens>
</cuvant>
<cuvant titlu="medicament">
<definitie>substanta utilizata pentru a vindeca, ameliora sau preveni o boala</definitie>
<sens>elixir</sens>
<sens>leac</sens>
<sens>remediu</sens>
</cuvant>
</sinonime>
</xsl:variable>
<xsl:template match="/" name="main">
<xsl:apply-templates select="$doc"/>
</xsl:template>
<xsl:template match="sinonime">
<xsl:variable name="counts" as="element()">
<counts>
<xsl:apply-templates select="*"/>
</counts>
</xsl:variable>
<xsl:variable name="min" select="min($counts/count/xs:integer(@n))"/>
<results>
<xsl:for-each select="$counts/count[xs:integer(@n) eq $min]">
<result>
<xsl:value-of select="@name"/>
</result>
</xsl:for-each>
</results>
</xsl:template>
<xsl:template match="cuvant">
<count name="{ @titlu }" n="{ count(sens) }"/>
</xsl:template>
</xsl:stylesheet>