2014-09-18 221 views
5

我已經完成了相當多的搜索,並且還沒有完全能夠使用XSLT提出任何問題。我正在嘗試使用一個XML模板(對於McPAT,部分顯示如下)來指定系統規格並複製component id="system.core0" name="core0"節點,以便我可以有N個核心節點。每個人都必須具有「system.core#」作爲id,「core#」作爲名稱,其中#是核心編號0-n。修改節點中的屬性子串和所有子節點

我還必須在任何後代節點(如下面的system.core0.itlb節點)中複製此節點。更進一步,在任何具有諸如「config.system.cpu.clock」等值的後代節點中,我必須將節點號附加到「cpu」。

最後,我必須覆蓋 param name="number_of_cores" value="1" 下系統 param name="number_of_cores" value="n" 和改變 param name="homogenous_cores" value="1"param name="homogenous_cores" value="0"

的XML目前看起來是這樣的:

<?xml version="1.0" ?> 
<component id="root" name="root"> 
    <component id="system" name="system"> 
     <param name="number_of_cores" value="1"/> 
     <param name="homogeneous_cores" value="1"/> 
     <param name="number_of_L1Directories" value="0"/> 
     <param name="number_of_L2Directories" value="0"/> 
     <param name="number_of_L2s" value="1"/> 
     <param name="Private_L2" value="0"/> 
     <param name="number_of_L3s" value="0"/> 
     <param name="number_of_NoCs" value="1"/> 
     ... 
     <component id="system.core0" name="core0"> 
      <!-- Core property --> 
      <param name="clock_rate" value="{1e-6/config.system.cpu.clock*1e12}"/> 
      <param name="opt_local" value="1"/>  
      <stat name="total_instructions" value="{stats.system.cpu.iq.iqInstsIssued}"/> 

      ... 
      <component id="system.core0.itlb" name="itlb"> 
       <param name="number_entries" value="{config.system.cpu.itb.size}"/> 
       <stat name="total_accesses" value="{stats.system.cpu.itb.fetch_accesses}"/> 
       ... 
      </component> 
     </component> 
    </component> 
</component> 

有相當多的線在這裏。由於SO,我已經複製了system.core0節點N次。我會張貼鏈接,但我找不到該頁面。我知道Dimitre Novatchev提出了我所遵循的答案,我想借此機會向他表示讚賞。到目前爲止,XSLT樣式表看起來是這樣的:

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 

    <xsl:param name="n" select="5"/> 

    <!--Identity template--> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="component[@id='system']/component[@name='core0']"> 
     <xsl:call-template name="copyNtimes"> 
      <xsl:with-param name="n" select="$n"/> 
      <xsl:with-param name="core_num" select="1"/> 
     </xsl:call-template> 
    </xsl:template> 

    <xsl:template name="copyNtimes"> 
     <xsl:param name="n" select="0"/> 
     <xsl:param name="core_num" select="1"/> 

     <xsl:if test="$n > 0"> 
      <xsl:copy> 
       <xsl:apply-templates select="@*|node()"/> 
      </xsl:copy> 
      <xsl:text> 
      </xsl:text> 
      <xsl:call-template name="copyNtimes"> 
       <xsl:with-param name="n" select="$n -1"/> 
       <xsl:with-param name="core_num" select="$core_num+1"/> 
      </xsl:call-template> 
     </xsl:if> 
    </xsl:template> 

</xsl:stylesheet> 

因此,在通過xsltproc的運行這個月底,我有system.core0原來的重複N次。剩下的幾天讓我瘋狂了好幾天。我如何着手改變我創建的每個新節點的核心數字,並在所有子節點中反映這一點?任何幫助都將有所幫助,即使它不是代碼。我已經嘗試過製作新的模板和使用副本,但似乎沒有任何東西讓我更接近。

我也可以將這一切都帶入另一種語言,比如Perl,在那裏我可以運行XSLT樣式表來複制更改並手動修改屬性字符串(如果這樣會更容易)。我知道Perl爲XML和XSLT提供了一些相當不錯的模塊。儘管如此,我認爲XSLT應該可以做到這一點,而且由於我剛剛接觸它,這種格式正在讓我失望。

編輯: 什麼,我需要一個例子輸出是這樣的:

<?xml version="1.0" ?> 
    <component id="root" name="root"> 
     <component id="system" name="system"> 
      <param name="number_of_cores" value="3"/> 
      <param name="homogeneous_cores" value="0"/> 
      <param name="number_of_L1Directories" value="0"/> 
      <param name="number_of_L2Directories" value="0"/> 
      <param name="number_of_L2s" value="1"/> 
      <param name="Private_L2" value="0"/> 
      <param name="number_of_L3s" value="0"/> 
      <param name="number_of_NoCs" value="1"/> 
      <!--...--> 
      <component id="system.core0" name="core0"> 
       <!-- Core property --> 
       <param name="clock_rate" value="{1e-6/config.system.cpu0.clock*1e12}"/> 
       <param name="opt_local" value="1"/>  
       <stat name="total_instructions" value="{stats.system.cpu0.iq.iqInstsIssued}"/> 
       <!--...--> 
       <component id="system.core0.itlb" name="itlb"> 
        <param name="number_entries" value="{config.system.cpu0.itb.size}"/> 
        <stat name="total_accesses" value="{stats.system.cpu0.itb.fetch_accesses}"/> 
        ... 
       </component> 
      </component> 
      <component id="system.core1" name="core1"> 
       <!-- Core property --> 
       <param name="clock_rate" value="{1e-6/config.system.cpu1.clock*1e12}"/> 
       <param name="opt_local" value="1"/>  
       <stat name="total_instructions" value="{stats.system.cpu1.iq.iqInstsIssued}"/> 
       <!--...--> 
       <component id="system.core1.itlb" name="itlb"> 
        <param name="number_entries" value="{config.system.cpu1.itb.size}"/> 
        <stat name="total_accesses" value="{stats.system.cpu1.itb.fetch_accesses}"/> 
        ... 
       </component> 
      </component><component id="system.core2" name="core2"> 
       <!-- Core property --> 
       <param name="clock_rate" value="{1e-6/config.system.cpu2.clock*1e12}"/> 
       <param name="opt_local" value="1"/>  
       <stat name="total_instructions" value="{stats.system.cpu2.iq.iqInstsIssued}"/> 
       <!--...--> 
       <component id="system.core2.itlb" name="itlb"> 
        <param name="number_entries" value="{config.system.cpu2.itb.size}"/> 
        <stat name="total_accesses" value="{stats.system.cpu2.itb.fetch_accesses}"/> 
        ... 
       </component> 
      </component> 
     </component> 
    </component> 
+0

從哪裏值'n'來自新的'param name =「number_of_cores」value =「n」'?始終來自XSLT中名爲'n'的全局參數? – kjhughes 2014-09-18 16:17:51

+0

在XSLT樣式表中,我將它作爲參數傳遞,設置在文件的頂部。我假設我可以在那裏使用它,但如果這是不可能的,我相信我可以在頂部發表評論,以便在不同的地方修改n。 – 2014-09-18 16:20:31

+0

這似乎是一個合法的問題,但很難理解散文。請顯示實際的XML輸出並解釋它與您需要的不同之處。 – 2014-09-18 16:28:45

回答

3

(1)如果以下兩個模板添加到您的XSLT,

<xsl:template match="param[@name='number_of_cores' and @value='1']"> 
    <param name="number_of_cores" value="{$n}"/> 
    </xsl:template> 

    <xsl:template match="param[@name='homogeneous_cores' and @value='1']"> 
    <param name="homogenous_cores" value="0"/> 
    </xsl:template> 

您將覆蓋身份轉換並能夠輸出不同的param元素,如上所示。

(2)如果調整內copyNtimes複製如下,

<xsl:copy> 
    <xsl:attribute name="id" select="concat('system.core', $n)"/> 
    <xsl:attribute name="name" select="concat('core', $n)"/> 
    <xsl:apply-templates select="node()"/> 
    </xsl:copy> 

你會不會產生碳副本,但副本,其中@id@name反映傳遞給copyNtimes拷貝數。

(3)如果進一步調整copyNtimesxsl:apply-template到隧道n(XSLT 2.0需要),

<xsl:apply-templates select="node()"> 
    <xsl:with-param name="compNum" tunnel="yes" select="$n"/> 
    </xsl:apply-templates> 

,並且還添加模板在隧道的另一側處理itlbcomponents

<xsl:template match="component[@name='itlb']"> 
    <xsl:param name="compNum" tunnel="yes"/> 
    <component name="itlb" value="{concat('system.core',$compNum,'.itlb')}"> 
     <xsl:apply-templates/> 
    </component> 
    </xsl:template> 

你能工作的組件數量爲後代itlbcomponents

更新(第三次)完整的代碼和樣本輸入/輸出XML文檔遵循...

此輸入XML文檔:

<?xml version="1.0" ?> 
<component id="root" name="root"> 
    <component id="system" name="system"> 
    <param name="number_of_cores" value="1"/> 
    <param name="homogeneous_cores" value="1"/> 
    <param name="number_of_L1Directories" value="0"/> 
    <param name="number_of_L2Directories" value="0"/> 
    <param name="number_of_L2s" value="1"/> 
    <param name="Private_L2" value="0"/> 
    <param name="number_of_L3s" value="0"/> 
    <param name="number_of_NoCs" value="1"/> 
    <!-- ... --> 
    <component id="system.core0" name="core0"> 
     <!-- Core property --> 
     <param name="clock_rate" value="{1e-6/config.system.cpu.clock*1e12}"/> 
     <param name="opt_local" value="1"/>  
     <stat name="total_instructions" value="{stats.system.cpu.iq.iqInstsIssued}"/> 

     <!-- ... --> 
     <component id="system.core0.itlb" name="itlb"> 
     <param name="number_entries" value="{config.system.cpu.itb.size}"/> 
     <stat name="total_accesses" value="{stats.system.cpu.itb.fetch_accesses}"/> 
     <!-- ... --> 
     </component> 
    </component> 
    </component> 
</component> 

鑑於此XSLT轉換:

<?xml version="1.0"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 

    <xsl:param name="n" select="5"/> 

    <!--Identity template--> 
    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="param[@name='number_of_cores' and @value='1']"> 
    <param name="number_of_cores" value="{$n}"/> 
    </xsl:template> 

    <xsl:template match="param[@name='homogeneous_cores' and @value='1']"> 
    <param name="homogenous_cores" value="0"/> 
    </xsl:template> 

    <xsl:template match="component[@name='itlb']"> 
    <xsl:param name="compNum" tunnel="yes"/> 
    <component name="itlb" value="{concat('system.core',$compNum,'.itlb')}"> 
     <xsl:apply-templates/> 
    </component> 
    </xsl:template> 

    <xsl:template match="component[@id='system']/component[@name='core0']"> 
    <xsl:call-template name="copyNtimes"> 
     <xsl:with-param name="n" select="$n"/> 
     <xsl:with-param name="core_num" select="1"/> 
    </xsl:call-template> 
    </xsl:template> 

    <xsl:template name="copyNtimes"> 
    <xsl:param name="n" select="0"/> 
    <xsl:param name="core_num" select="1"/> 

    <xsl:if test="$n > 0"> 
     <xsl:copy> 
     <xsl:attribute name="id" select="concat('system.core', $n)"/> 
     <xsl:attribute name="name" select="concat('core', $n)"/> 
     <xsl:apply-templates select="node()"> 
      <xsl:with-param name="compNum" tunnel="yes" select="$n"/> 
     </xsl:apply-templates> 
     </xsl:copy> 
     <xsl:text> 
     </xsl:text> 
     <xsl:call-template name="copyNtimes"> 
     <xsl:with-param name="n" select="$n -1"/> 
     <xsl:with-param name="core_num" select="$core_num+1"/> 
     </xsl:call-template> 
    </xsl:if> 
    </xsl:template> 

</xsl:stylesheet> 

將產生這個輸出X ML文檔:

<?xml version="1.0" encoding="UTF-8"?> 
<component id="root" name="root"> 
    <component id="system" name="system"> 
     <param name="number_of_cores" value="5"/> 
     <param name="homogenous_cores" value="0"/> 
     <param name="number_of_L1Directories" value="0"/> 
     <param name="number_of_L2Directories" value="0"/> 
     <param name="number_of_L2s" value="1"/> 
     <param name="Private_L2" value="0"/> 
     <param name="number_of_L3s" value="0"/> 
     <param name="number_of_NoCs" value="1"/> 
     <!-- ... --> 
     <component id="system.core5" name="core5"> 
     <!-- Core property --> 
     <param name="clock_rate" value="{1e-6/config.system.cpu.clock*1e12}"/> 
     <param name="opt_local" value="1"/>  
     <stat name="total_instructions" value="{stats.system.cpu.iq.iqInstsIssued}"/> 

     <!-- ... --> 
     <component name="itlb" value="system.core5.itlb"> 
      <param name="number_entries" value="{config.system.cpu.itb.size}"/> 
      <stat name="total_accesses" value="{stats.system.cpu.itb.fetch_accesses}"/> 
      <!-- ... --> 
     </component> 
     </component> 
     <component id="system.core4" name="core4"> 
     <!-- Core property --> 
     <param name="clock_rate" value="{1e-6/config.system.cpu.clock*1e12}"/> 
     <param name="opt_local" value="1"/>  
     <stat name="total_instructions" value="{stats.system.cpu.iq.iqInstsIssued}"/> 

     <!-- ... --> 
     <component name="itlb" value="system.core4.itlb"> 
      <param name="number_entries" value="{config.system.cpu.itb.size}"/> 
      <stat name="total_accesses" value="{stats.system.cpu.itb.fetch_accesses}"/> 
      <!-- ... --> 
     </component> 
     </component> 
     <component id="system.core3" name="core3"> 
     <!-- Core property --> 
     <param name="clock_rate" value="{1e-6/config.system.cpu.clock*1e12}"/> 
     <param name="opt_local" value="1"/>  
     <stat name="total_instructions" value="{stats.system.cpu.iq.iqInstsIssued}"/> 

     <!-- ... --> 
     <component name="itlb" value="system.core3.itlb"> 
      <param name="number_entries" value="{config.system.cpu.itb.size}"/> 
      <stat name="total_accesses" value="{stats.system.cpu.itb.fetch_accesses}"/> 
      <!-- ... --> 
     </component> 
     </component> 
     <component id="system.core2" name="core2"> 
     <!-- Core property --> 
     <param name="clock_rate" value="{1e-6/config.system.cpu.clock*1e12}"/> 
     <param name="opt_local" value="1"/>  
     <stat name="total_instructions" value="{stats.system.cpu.iq.iqInstsIssued}"/> 

     <!-- ... --> 
     <component name="itlb" value="system.core2.itlb"> 
      <param name="number_entries" value="{config.system.cpu.itb.size}"/> 
      <stat name="total_accesses" value="{stats.system.cpu.itb.fetch_accesses}"/> 
      <!-- ... --> 
     </component> 
     </component> 
     <component id="system.core1" name="core1"> 
     <!-- Core property --> 
     <param name="clock_rate" value="{1e-6/config.system.cpu.clock*1e12}"/> 
     <param name="opt_local" value="1"/>  
     <stat name="total_instructions" value="{stats.system.cpu.iq.iqInstsIssued}"/> 

     <!-- ... --> 
     <component name="itlb" value="system.core1.itlb"> 
      <param name="number_entries" value="{config.system.cpu.itb.size}"/> 
      <stat name="total_accesses" value="{stats.system.cpu.itb.fetch_accesses}"/> 
      <!-- ... --> 
     </component> 
     </component> 

    </component> 
</component> 
+0

這實際上正是我所需要的那個問題!我還需要爲核心的每個獨立實例將core0更改爲core0,core1,core2,...,core(n-1)。 – 2014-09-18 16:39:43

+0

答覆已更新。你在這裏得到兩個答案的價格。 ;-) – kjhughes 2014-09-18 16:53:08

+0

謝謝!這絕對是非常有幫助的!有沒有一種方法可以將相同的邏輯應用於後代節點,例如,在「system.core4」下,會有一個組件「system.core4.itlb」而不是「system.core0」 .itlb「 – 2014-09-18 17:01:18

相關問題