2012-01-10 48 views
0

在另一個線程中,另一個開發人員通過提供以下真棒答案來幫助我。如何在兩個模板上應用濾鏡

基本上使用兩個模板來檢索我需要在我的表中呈現的所有數據。

我現在的問題是,我現在應該如何應用一個過濾器來過濾兩個模板?我可以在xsl:template match="SubGroup"中成功使用xsl:value-of select="@Name[contains(.,NameIWant1)]",但我無法弄清楚如何將它應用於xsl:template match="Data"。我試圖用各種名字的方式無濟於事。

在此先感謝您們對我學習XSLT的巨大幫助!公斤

示例XML

<?xml-stylesheet type="text/xsl" href="Sample.xsl"?> 
<DataView Client="Client1" ID="1000" TimeStamp="12/7/2011 5:35:09 PM"> 
<Group ID="5000" Name="GroupName1"> 
<SubGroup ID="7000" Order="0" Name="NameIWant1"> 
<Data ID="1" Name="DataName1" Order="0">1</Data> 
<Data ID="2" Name="DataName2" Order="0">2</Data> 
<Data ID="3" Name="DataName3" Order="0">3</Data> 
<Data ID="12" Name="DataName4" Order="0">4</Data> 
</SubGroup> 
<SubGroup ID="8000" Order="0" Name="NameIWant2"> 
<Data ID="1" Name="DataName1" Order="0">6</Data> 
<Data ID="2" Name="DataName2" Order="0">7</Data> 
<Data ID="3" Name="DataName3" Order="0">8</Data> 
<Data ID="12" Name="DataName4" Order="0">9</Data> 
</SubGroup> 
</Group> 
</DataView> 

Sample.xslt

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="/"> 
     <html> 
      <body> 
       <h2>My Data</h2> 
       <table border="1"> 
        <tr bgcolor="#9acd32"> 
         <th>Subgroup</th> 
         <th>DataName1</th> 
         <th>DataName2</th> 
         <th>DataName3</th> 
         <th>DataName4</th> 
        </tr> 
        <xsl:apply-templates/> 
       </table> 
      </body> 
     </html> 
    </xsl:template> 
    <xsl:template match="SubGroup"> 
     <tr> 
      <td><xsl:value-of select="@Name"/></td> 
      <xsl:apply-templates/> 
     </tr> 
    </xsl:template> 
    <xsl:template match="Data"> 
     <td><xsl:apply-templates/></td> 
    </xsl:template> 
</xsl:stylesheet> 

我得到這個...

____________________________ 
NameIWant1 | 1 | 2 | 3 | 4 | 
      | 6 | 7 | 8 | 9 | 

我想獲得..

____________________________ 
NameIWant1 | 1 | 2 | 3 | 4 | 
+0

你們是不是要濾除'SubGroup'的基礎上,'Name'屬性顯示? – 2012-01-10 20:22:58

+0

是亞組 – kgjunk 2012-01-10 20:29:10

+0

的名稱attrubute我想我明白了。看看我的答案。如果這不是你想做的事,讓我知道,我會解決它。 – 2012-01-10 20:37:24

回答

0

通過名稱過濾SubGroup的最簡單的方法是將表達移動到匹配模式,如下所示:

<xsl:template match="SubGroup[contains(@Name, 'NameIWant1')]"> 
    <tr> 
     <td><xsl:value-of select="@Name"/></td> 
     <xsl:apply-templates/> 
    </tr> 
</xsl:template> 

然後忽略所有其他SubGroup元件用空模板:

<xsl:template match="SubGroup"/> 

完整的樣式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="/"> 
     <html> 
      <body> 
       <h2>My Data</h2> 
       <table border="1"> 
        <tr bgcolor="#9acd32"> 
         <th>Subgroup</th> 
         <th>DataName1</th> 
         <th>DataName2</th> 
         <th>DataName3</th> 
         <th>DataName4</th> 
        </tr> 
        <xsl:apply-templates/> 
       </table> 
      </body> 
     </html> 
    </xsl:template> 
    <xsl:template match="SubGroup[contains(@Name, 'NameIWant1')]"> 
     <tr> 
      <td><xsl:value-of select="@Name"/></td> 
      <xsl:apply-templates/> 
     </tr> 
    </xsl:template> 
    <xsl:template match="SubGroup"/> 
    <xsl:template match="Data"> 
     <td><xsl:apply-templates/></td> 
    </xsl:template> 
</xsl:stylesheet> 
+1

完美的作品。再次感謝您的專業知識。我已經爲我的開始XSLT書籍LOL下了訂單 – kgjunk 2012-01-10 21:53:20

相關問題