XSLT Muenchian Grouping忽略特定组

时间:2017-06-15 17:24:50

标签: xml xslt xpath xslt-1.0

我有这样的XML:

  <DocumentElement>
    <ManagerReport>
        <UserName>username</UserName>
        <ShortTerm>2</ShortTerm>
        <LongTerm>4</LongTerm>
        <SupervisorContact>ADMIN@COMPANY.COM</SupervisorContact>
        <DBName>SQLDB1</DBName>
      </ManagerReport>
... more ManagerReport nodes...
  </DocumentElement>

我正在使用以下密钥对DBName进行分组(Muenchian分组):

<xsl:key name="groups" match="ManagerReport" use="./DBName"/>

以及以下模板:

<xsl:template match="/DocumentElement">
<HTML>
  <BODY>
      <xsl:apply-templates select="ManagerReport[generate-id() = generate-id(key('groups', ./DBName)[1])]"/>
    </BODY>
</HTML>

  <xsl:template match ="ManagerReport">
  <TEXT>
    The following employees have documents checked out in <xsl:value-of select="./DBName"/>:
  </TEXT>
  <BR></BR>
  <TABLE Border = "1">
    <TR>
      <TH>Username</TH>
      <TH>Short Term</TH>
      <TH>Medium Term</TH>
      <TH>Long Term</TH>
    </TR>
    <xsl:for-each select="key('groups',./DBName)">
      <xsl:if test="./SupervisorContact = $mgr">
      <TR>
        <TD>
          <xsl:value-of select ="./UserName"/>
        </TD>
        <TD>
          <xsl:call-template name ="ApplyTemplatesOrDefault">
            <xsl:with-param name="elem" select="./ShortTerm"/>
            <xsl:with-param name="default">0</xsl:with-param>
          </xsl:call-template>
        </TD>
        <TD>
          <xsl:call-template name ="ApplyTemplatesOrDefault">
            <xsl:with-param name="elem" select="./MedTerm"/>
            <xsl:with-param name="default">0</xsl:with-param>
          </xsl:call-template>
        </TD>
        <TD>
          <xsl:call-template name ="ApplyTemplatesOrDefault">
            <xsl:with-param name="elem" select="./LongTerm"/>
            <xsl:with-param name="default">0</xsl:with-param>
          </xsl:call-template>
        </TD>
      </TR>
      </xsl:if>
    </xsl:for-each>
  </TABLE>
  <BR></BR>
  <BR></BR>

此模板的结果是每个数据库的表,其中包含相应管理器报告节点中的信息。 mgr值作为参数传入,以便仅打印对应于特定主管的ManagerReport值。

这很好用,除了如果没有对应于给定SupervisorContact的特定DBName的节点,则打印一个空表(只是标题)。我不想打印这些特定的表格。

我能想象的唯一方法是在match密钥上添加谓词groups,这是严格禁止的。我怎样才能摆脱这些&#34;空&#34;表?

请注意我正在使用,并且必须使用XSL 1.0

1 个答案:

答案 0 :(得分:0)

您似乎可以通过将xsl:apply-templates替换为<xsl:apply-templates select="ManagerReport[generate-id() = generate-id(key('groups', ./DBName)[1])]"/>来将条件放在<xsl:apply-templates select="ManagerReport[generate-id() = generate-id(key('groups', ./DBName)[1]) and key('groups', DBName)[SupervisorContact = $mgr]]"/>上。