2014-12-30 51 views
0

作爲解決here問題的擴展,我們如何計算每個標記和屬性的頻率數?使用XSLT計算XML中的標記/屬性的頻率

例如,對於本文檔:

<a> 
<apple color="red"/> 
<banana color="yellow"/> 
<sugar taste="sweet"/> 
<cat size="small"/> 
</a> 

像這樣結果(最好是在兩個單獨的表)需要:

對於標籤:蘋果= 1,香蕉= 1,糖= 1 ,貓= 1

對於屬性:彩色= 2,味道= 1,大小= 1

+4

這是一個*分組*問題。做一個搜索,這是這裏最常見的問題之一。請注意,對於XSLT 1.0或2.0,答案是不同的。 –

+0

我已經研究了很多(在這裏和其他論壇),但提供的解決方案不適用於這種情況(至少,我找不到合適的!)。無論如何,我仍在繼續研究。 – Eilia

+0

@EiliaAbraham,看到這個答案,http://stackoverflow.com/a/19828481/3049413 –

回答

1

嘗試這種情況:

XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" omit-xml-declaration="yes"/> 
<xsl:key name="kEleName" match="*" use="local-name()"/> 
<xsl:key name="kAttribName" match="@*" use="local-name()"/> 

<xsl:variable name="var1"> 
    <xsl:for-each select="https://stackoverflow.com/a/*/@*[generate-id() = generate-id(key('kAttribName', name()))]"> 
     <xsl:value-of select="concat(name(.), ' ', count(key('kAttribName', name(.))))"/> 
     <xsl:if test="not(position()=last())"> 
     <xsl:text>,&#160;</xsl:text> 
     </xsl:if> 
    </xsl:for-each> 
</xsl:variable> 

    <xsl:template match="/*"> 
     <xsl:apply-templates select="*[generate-id() = generate-id(key('kEleName', name()))]"/> 
    </xsl:template> 

    <xsl:template match="*"> 
     <xsl:if test="position()=1"><xsl:text>For tags:&#160;</xsl:text></xsl:if> 
      <xsl:value-of select="concat(name(.), ' ', count(key('kEleName', name(.))))"/> 
      <xsl:if test="following-sibling::*"> 
       <xsl:text>,&#160;</xsl:text> 
      </xsl:if> 

      <xsl:if test="position()=last()"> 
       <xsl:text>&#10;For attributes:&#160;</xsl:text> 
      <xsl:value-of select="$var1"/> 
      </xsl:if> 

    </xsl:template> 
</xsl:stylesheet> 

XML:

<a> 
    <apple color="red"/> 
    <apple color="green"/> 
    <banana color="yellow"/> 
    <sugar taste="sweet"/> 
    <cat size="small"/> 
</a> 

輸出:

For tags: apple 2, banana 1, sugar 1, cat 1  
For attributes: color 3, taste 1, size 1  
+0

太棒了!感謝@Rudramuni TP,它的工作原理。 – Eilia