2014-12-30 2 views
0

В качестве дополнения к вопросу, который решил here, как мы можем подсчитать количество частот каждого тега и атрибута?Частота подсчета тегов/атрибутов в XML с использованием XSLT

Например, для этого документа:

<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

Смежные вопросы