将 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`道具一起使用

无法将FirebaseUI与片段一起使用

与具有多个文本子节点的节点一起使用时,XPath contains(text(),'some string') 不起作用