将 contains 函数与 xsl:key 一起使用
Posted
技术标签:
【中文标题】将 contains 函数与 xsl:key 一起使用【英文标题】:Using contains function with xsl:key 【发布时间】:2017-06-25 12:35:04 【问题描述】:我是 XSLT 1.0 的新手,请原谅我糟糕的编码技能。我正在尝试计算在 xsl:key 中包含“fee”之类的字符串的记录。虽然这适用于xsl:value-of select="count(//Comments[contains(., 'Fee')])"
,但它会将计数应用于所有不同的记录。如何计算包含特定于 ReferralDesc 元素的字符串的记录。
输出(当前)
Referral Count Days Days CntInfo
Architect 9 794 88.2 1
Building 26 1784 68.6 1
Trees 6 548 91.3 1
XML
<Referrals>
<Referral>
<ApplicationId>51240</ApplicationId>
<Proposal>Demolition work</Proposal>
<ReferralDesc>Architect</ReferralDesc>
<Lapsed>49</Lapsed>
<Officer>Mark What</Officer>
<Comments>Information provided</Comments>
</Referral>
<Referral>
<ApplicationId>51304</ApplicationId>
<Proposal>Alterations and Additions</Proposal>
<ReferralDesc>Tree</ReferralDesc>
<Lapsed>28</Lapsed>
<Officer>Mark Some</Officer>
<Comments>Fee quoted</Comments>
</Referral>
</Referrals>
XSLT
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="groups" match="Referral" use="ReferralDesc" />
<xsl:key name="info" match="Referral" use="normalize-space(Comments)" />
<xsl:key name="days" match="Referral" use="Lapsed" />
<xsl:template match="NewDataSet">
<table style="width:55%; font-size:10px;">
<thead>
<th style="width:25%" class="borders">Referral</th>
<th style="width:10%" class="borders">Count</th>
<th style="width:10%" class="borders">Days total</th>
<th style="width:10%" class="borders">Days avg</th>
<th style="width:10%" class="borders">CntInfo</th>
</thead>
<xsl:for-each select="Referrals/Referral[count(. | key('groups', ReferralDesc)[1]) = 1]">
<xsl:sort select="ReferralDesc" />
<tr>
<td class="borders">
<xsl:value-of select="ReferralDesc" />
</td>
<td class="borders">
<xsl:value-of select="count(. | key('groups', ReferralDesc))"/>
</td>
<td class="borders">
<!-- <xsl:value-of select="sum(Lapsed)"/> -->
<xsl:value-of select="sum(key('groups',ReferralDesc)/Lapsed)"/>
</td>
<td class="borders">
<xsl:variable name="nRef">
<xsl:value-of select="count(. | key('groups', ReferralDesc))"/>
</xsl:variable>
<xsl:variable name="sDay">
<xsl:value-of select="sum(key('groups',ReferralDesc)/Lapsed)"/>
</xsl:variable>
<xsl:value-of select="format-number($sDay div $nRef, '###,###.0')"/>
</td>
<td class="borders">
<xsl:value-of select="count(//Comments[contains(., 'fee')])" />
</td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stlyesheet>
回答
看来坚持是有回报的。更新键()。 used xsl:key name="info" match="Referral[contains(./Comments, 'fee')]" use="ReferralDesc"
【问题讨论】:
【参考方案1】:你想要的表达是这样的......
<xsl:value-of select="count(key('groups', ReferralDesc)/Comments[contains(., 'fee')])" />
顺便说一句,XSLT 中的这个表达式......
<xsl:value-of select="count(. | key('groups', ReferralDesc))"/>
可以稍微简化一下(因为你已经知道当前节点是当前键的一部分)
<xsl:value-of select="count(key('groups', ReferralDesc))"/>
【讨论】:
谢谢 Tim C,感谢您的回复。以上是关于将 contains 函数与 xsl:key 一起使用的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Cloudbuild 将具有不同标签的 Docker 镜像与配置文件一起存储在 Container Registry 中?
我可以在 switch 语句中使用字符串并将 .contains() 与 Java 一起使用吗?
在 XSLT 中调用 str_contains 或任何 PHP 函数以将字符串与模式匹配
MUI v5:失败的道具类型:`Grid`的道具`direction`只能与`container`道具一起使用
与具有多个文本子节点的节点一起使用时,XPath contains(text(),'some string') 不起作用