我已經完成了相當多的搜索,並且還沒有完全能夠使用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>
從哪裏值'n'來自新的'param name =「number_of_cores」value =「n」'?始終來自XSLT中名爲'n'的全局參數? – kjhughes 2014-09-18 16:17:51
在XSLT樣式表中,我將它作爲參數傳遞,設置在文件的頂部。我假設我可以在那裏使用它,但如果這是不可能的,我相信我可以在頂部發表評論,以便在不同的地方修改n。 – 2014-09-18 16:20:31
這似乎是一個合法的問題,但很難理解散文。請顯示實際的XML輸出並解釋它與您需要的不同之處。 – 2014-09-18 16:28:45