如何使用xsl获取元素名称及其值?

时间:2014-04-10 12:26:41

标签: xml xslt xslt-2.0

我有一个xml,client/product/analytics/count下的元素名称未知。有没有办法可以遍历并获取每个元素名称和它的等价值?

下面是我的xml数据

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="client.xsl"?>
<client version="1.0">
    <product>
        <analytics>
            <count>
                <SkinsCount>14</SkinsCount>
                <AppsCount>6</AppsCount>
                <AbspCount>2</AbspCount>
            </count>
        </analytics>
    </product>
</client>

我的xsl代码的一部分

...
<xsl:variable name="NA" select="'no data'" />
<h3><span style="color:#328aa4"><a name="_analytics" href="#_top">Analytics </a></span></h3>                
    <h3>Count</h3>  

    <dd><br/>
        <xsl:choose>
            <xsl:when test="client/product/analytics/count/*">
                <table border="1">
                    <tbody>
                        <xsl:if test="client/product/analytics/count/AbspCount"><tr>
                            <th align="left">Absp Count</th><td><xsl:value-of select="client/product/analytics/count/AbspCount"/></td></tr>
                        </xsl:if>
                        <xsl:if test="client/product/analytics/count/SkinsCount"><tr>
                            <th align="left">Skins Count</th><td><xsl:value-of select="client/product/analytics/count/SkinsCount"/></td></tr>
                        </xsl:if>
                        <xsl:if test="client/product/analytics/count/AppsCount"><tr>
                            <th align="left">Apps Count</th><td><xsl:value-of select="client/product/analytics/count/AppsCount"/></td></tr>
                        </xsl:if>                   
                    </tbody>
                </table>
            </xsl:when>
            <xsl:otherwise>
                <br/><xsl:value-of select="$NA"/>
            </xsl:otherwise>
        </xsl:choose>           
    </dd>
...
当我专门使用AppsCount, AbspCount & SkinsCount

等已知元素名称时,

当前输出快照

enter image description here

2 个答案:

答案 0 :(得分:2)

尝试类似:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/">
    <table border="1">
         <xsl:for-each select="client/product/analytics/count/*">
             <tr>
                 <th align="left"><xsl:value-of select="name()"/></th>
                 <td><xsl:value-of select="."/></td>
             </tr>
         </xsl:for-each> 
     </table>
 </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:1)

您可能应该首先选择 count 元素的所有子元素

<xsl:apply-templates select="client/product/analytics/count/*" />

然后你将有一个模板匹配这些元素,并输出元素名称和值,如此

<xsl:template match="count/*">
    <tr>
        <td><xsl:value-of select="local-name()" /></td>
        <td><xsl:value-of select="." /></td>
    </tr>
</xsl:template>

当然,这将输出不带空格的元素名称(即“SkinsCount”)。如果元素名称始终以“Count”结尾,则可以执行此操作

<xsl:value-of select="concat(substring-before(local-name(), 'Count'), ' Count')" />

但是如果您使用的是XSLT 2.0,则可以使用 xsl:analyze-string 根据大写字母拆分元素名称。

试试这个XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes" />

    <xsl:template match="/">
        <table>
            <xsl:apply-templates select="client/product/analytics/count/*" />
        </table>
    </xsl:template>

    <xsl:template match="count/*">
        <tr>
            <td>
                <xsl:analyze-string select="local-name()" regex="[A-Z][a-z0-9]*">
                    <xsl:matching-substring>
                        <xsl:value-of select="concat(., ' ')" />
                    </xsl:matching-substring>
                </xsl:analyze-string>
            </td>
            <td><xsl:value-of select="." /></td>
        </tr>
    </xsl:template>
</xsl:stylesheet>