如何解决用XSLT中单个xml字段的计数填充页脚行
我正在处理一项要求,其中需要用源XML中存在的每个XML字段的数量填充页脚行。在下面的示例XML中,总共有4个
我能够通过计算每个子XML字段来实现。这是正确的方法吗?或其他更好的方法来实现这一目标?你能请教吗?
<xsl:value-of select="sum(count(Report_Entry/id) + count(Report_Entry/name) + count(Report_Entry/bu)
+ count(Report_Entry/dept))"/>
示例XML
<?xml version='1.0' encoding='UTF-8'?>
<Report_Data>
<Report_Entry>
<id>12345</id>
<name>john</name>
<bu>1234</bu>
<dept>IT</dept>
</Report_Entry>
<Report_Entry>
<id>12346</id>
<name>john</name>
<bu>1294</bu>
</Report_Entry>
<Report_Entry>
<id>12349</id>
<dept>IT</dept>
</Report_Entry>
<Report_Entry>
<id>12341</id>
<name>john</name>
<bu>1034</bu>
<dept>IT</dept>
</Report_Entry>
</Report_Data>
我的XSLT
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
<xsl:output method="text" omit-xml-declaration="yes"/>
<xsl:variable name="tilde">
<xsl:text>~</xsl:text>
</xsl:variable>
<xsl:variable name="nextline">
<xsl:text>
</xsl:text>
</xsl:variable>
<xsl:template match="/Report_Data">
<xsl:for-each select="Report_Entry">
<xsl:if test="id">
<xsl:value-of select="id"/>
<xsl:value-of select="$tilde"/>
</xsl:if>
<xsl:if test="name">
<xsl:value-of select="name"/>
<xsl:value-of select="$tilde"/>
</xsl:if>
<xsl:if test="bu">
<xsl:value-of select="bu"/>
<xsl:value-of select="$tilde"/>
</xsl:if>
<xsl:if test="dept">
<xsl:value-of select="dept"/>
<xsl:value-of select="$tilde"/>
</xsl:if>
<xsl:value-of select="$nextline"/>
</xsl:for-each>
<xsl:value-of
select="sum(count(Report_Entry/id) + count(Report_Entry/name) + count(Report_Entry/bu) + count(Report_Entry/dept))"/>
</xsl:template>
</xsl:stylesheet>
输出
12345~john~1234~IT~
12346~john~1294~
12349~IT~
12341~john~1034~IT~
13
先谢谢了 Venk
解决方法
为什么不简单:
<xsl:value-of select="count(Report_Entry/*)"/>
或者,如果您希望将计数限制为仅已知节点:
<xsl:value-of select="count(Report_Entry/(id,name,bu,dept))"/>
在使用时,您可以将整个内容缩短为:
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/Report_Data">
<xsl:for-each select="Report_Entry">
<xsl:value-of select="id,dept" separator="'~'"/>
<xsl:text>
</xsl:text>
</xsl:for-each>
<xsl:value-of select="count(Report_Entry/*)"/>
</xsl:template>
</xsl:stylesheet>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。