我有一个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
等已知元素名称时,当前输出快照
答案 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>