【问题标题】:Counting frequency of tags / attributes in XML using XSLT使用 XSLT 计算 XML 中标签/属性的频率
【发布时间】:2014-12-30 07:36:36
【问题描述】:

作为解决here的问题的扩展,我们如何计算每个标签和属性的频率数?

例如,对于本文档:

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

需要这样的结果(最好在两个单独的表中):

对于标签:apple = 1、banana =1、sugar =1、cat=1

对于属性:color=2,taste=1,size=1

【问题讨论】:

  • 这是一个分组问题。搜索一下,这是这里最常被问到的问题之一。请注意,XSLT 1.0 或 2.0 的答案是不同的。
  • 我已经研究了很多(这里和其他论坛),但提供的解决方案不适用于这种情况(至少,我找不到合适的解决方案!)。无论如何,我会继续研究。
  • @EiliaAbraham,看到这个答案,stackoverflow.com/a/19828481/3049413
  • @Rudramuni TP,谢谢你,它似乎从相反的方向回答了我的问题。因此,它可以被视为一个很好的工作起点。此外,我目前正在考虑this one
  • 另外,也很有帮助:(xml.com/lpt/a/1010)

标签: xml xslt


【解决方案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="/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 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    • 2012-01-27
    • 2018-10-12
    • 1970-01-01
    相关资源
    最近更新 更多