2015-05-16 51 views
0

這是XML文件:哪些元素具有最小的子元素XSL

<sinonime> 
 
\t <cuvant titlu="timp"> 
 
\t \t <definitie>durata care corespunde desfasurarii unui evenimen</definitie> 
 
\t \t <sens>vreme</sens> 
 
\t \t <sens>sezon</sens> 
 
\t \t <sens>durata</sens> 
 
\t </cuvant> 
 
\t <cuvant titlu="harnic"> 
 
\t \t <definitie>care munceste mult, repede si cu folos</definitie> 
 
\t \t <sens>muncitor</sens> 
 
\t \t <sens>sarguincios</sens> 
 
\t </cuvant> 
 
\t <cuvant titlu="Enervat"> 
 
\t \t <definitie>scos din fire, in stare de iritare</definitie> 
 
\t \t <sens>nervos</sens> 
 
\t </cuvant> 
 
\t <cuvant titlu="parfum"> 
 
\t \t <definitie>ceva cu miros placut, frumos</definitie> 
 
\t \t <sens>mireasma</sens> 
 
\t \t <sens>esenta</sens> 
 
\t \t <sens>miros</sens> 
 
\t \t <sens>colonie</sens> 
 
\t </cuvant> 
 
\t <cuvant titlu="Eprubeta"> 
 
\t \t <definitie>tub de sticla inchis la capat</definitie> 
 
\t \t <sens>tub</sens> 
 

 
\t </cuvant> 
 
\t <cuvant titlu="medicament"> 
 
\t \t <definitie>substanta utilizata pentru a vindeca, ameliora sau preveni o boala</definitie> 
 
\t \t <sens>elixir</sens> 
 
\t \t <sens>leac</sens> 
 
\t \t <sens>remediu</sens> 
 
\t </cuvant> 
 
</sinonime>

我期望的輸出:

Enervat

Eprubeta

因爲這些是隻有一個的元素ens(子元素的最小數目'sens')

如何返回哪些元素具有最小子元素?

我想:

<xsl:for-each select="sinonime/cuvant"> 
 
\t <xsl:sort select="count(document('sinonime.xml')//cuvat/sens)"/> 
 
\t <xsl:if test="position()=last()"> 
 
\t <xsl:value-of select="@titlu"/> 
 
\t </xsl:if> 
 
</xsl:for-each>

回答

0

使用for-each循環在你的問題,你只會得到有sens節點的最小數量的元素1。你可以例如使用第一for-each拿到最低計數,然後打印所有cuvant節點的titlu屬性衣被合計用最小的數是這樣的:

<?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>&#xa;</xsl:text> 
     </xsl:if> 
    </xsl:for-each> 
    </xsl:template> 
</xsl:transform> 

當適用於您的輸入,這將產生輸出

Enervat 
Eprubeta 
+0

感謝!很有幫助! –

0

你可以很容易地解決這個問題,首先創建一個簡單的文檔,每個「cuvant」的數量和名稱,如:

<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>