2017-06-15 73 views
2

我有這樣的XML:基於數據庫名XSLT Muenchian分組的忽略特定羣體

<DocumentElement> 
    <ManagerReport> 
     <UserName>username</UserName> 
     <ShortTerm>2</ShortTerm> 
     <LongTerm>4</LongTerm> 
     <SupervisorContact>[email protected]</SupervisorContact> 
     <DBName>SQLDB1</DBName> 
     </ManagerReport> 
... more ManagerReport nodes... 
    </DocumentElement> 

對此我分組(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

這個效果很好,除了如果沒有節點對應給定的DBName的特定SupervisorContact,則會打印一個空的表格(只是標題)。我不想打印這些特定的表格。

我能想象的唯一方法是在groups密鑰上添加一個謂詞到match,這是嚴格禁止的。我怎樣才能擺脫這些「空」表?

請注意我正在使用,並且必須使用XSL 1.0

+0

你不能只使用''? –

+0

@MartinHonnen不計算節點集。 – mdsimps99

+0

請將整個XSLT包含在一個代碼塊中,而不是分解。 – Parfait

回答

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]]"/>