2014-09-18 18 views
5

Tôi đã thực hiện khá nhiều tìm kiếm và chưa hoàn toàn có thể tìm ra bất kỳ thứ gì chưa sử dụng XSLT. Tôi đang cố gắng để có một mẫu XML (cho McPAT, một phần được hiển thị dưới đây) dictating thông số kỹ thuật hệ thống và nhân đôi nút component id="system.core0" name="core0" vì vậy tôi có thể có N nút lõi. Mỗi người sẽ phải có "system.core #" làm id và "core #" làm tên với # là số lõi, 0-n.Sửa đổi chuỗi con của thuộc tính trong nút và tất cả trẻ em

Tôi cũng phải sao chép điều này trong bất kỳ nút con cháu nào như nút system.core0.itlb bên dưới.

Hơn nữa, trong bất kỳ nút hậu duệ nào có giá trị như "config.system.cpu.clock", tôi phải nối thêm số nút vào "cpu".

Cuối cùng, tôi phải ghi đè lên param name="number_of_cores" value="1" theo hệ thống với param name="number_of_cores" value="n" và thay đổi param name="homogenous_cores" value="1" để param name="homogenous_cores" value="0"

XML hiện trông như thế này:

<?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> 

Có khá một vài dòng ở đây. Tôi đã đi và sao chép nút system.core0 N lần, nhờ SO. Tôi sẽ đăng liên kết nhưng tôi không thể tìm thấy trang. Tôi biết rằng Dimitre Novatchev đặt câu trả lời mà tôi theo sau và tôi muốn cho anh ta tín dụng cho sự giúp đỡ của anh ta với điều đó. Cho đến nay, biểu định kiểu XSLT trông giống như sau:

<?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> 

Vì vậy, khi kết thúc hoạt động này thông qua xsltproc, tôi có bản gốc với hệ thống.được nhân đôi N lần. Những gì còn lại đã khiến tôi phát điên trong nhiều ngày. Làm thế nào để tôi đi về việc thay đổi các số lõi cho mỗi nút mới mà tôi tạo ra, phản ánh rằng trong tất cả các nút con là tốt? Bất kỳ sự trợ giúp nào cũng sẽ giúp ích, ngay cả khi nó không phải là mã. Tôi đã chơi xung quanh với việc tạo các mẫu mới và sử dụng bản sao nhưng không có gì khiến tôi gần gũi hơn.

Tôi cũng có thể đưa tất cả vào một ngôn ngữ khác như Perl nơi tôi có thể chạy biểu định kiểu XSLT để thay đổi trùng lặp và sửa đổi thủ công các chuỗi thuộc tính nếu dễ dàng hơn. Tôi biết Perl có một số mô-đun khá tốt cho cả XML và XSLT. Tôi cảm thấy rằng XSLT sẽ có thể làm điều này, mặc dù, và kể từ khi tôi mới đến nó, định dạng là ném tôi đi.

Sửa: Một ví dụ đầu ra của những gì tôi cần là một cái gì đó như thế này:

<?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

Từ đâu giá trị 'n' đến trong' param name = "number_of_cores" value = "n" '? Luôn luôn từ param toàn cục có tên 'n' trong XSLT? – kjhughes

+0

Trong biểu định kiểu XSLT, tôi có nó chuyển thành tham số, đặt ở đầu tệp. Tôi cho rằng tôi chỉ có thể sử dụng nó ở đó nhưng trong trường hợp đó là không thể, tôi chắc chắn tôi chỉ có thể làm cho một bình luận ở đầu nó sẽ phải được sửa đổi ở những nơi khác nhau cho những thay đổi trong n. –

+0

Điều này có vẻ là một câu hỏi hợp pháp, nhưng thật khó để hiểu được văn xuôi. Vui lòng hiển thị đầu ra XML thực tế và giải thích cách nó khác với những gì bạn cần. –

Trả lời

3

(1) Nếu bạn thêm hai mẫu sau đây để XSLT của bạn,

<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> 

bạn sẽ ghi đè quá trình chuyển đổi nhận dạng và có thể xuất các phần tử param khác nhau như minh họa ở trên.

(2) Nếu bạn điều chỉnh việc sao chép trong copyNtimes như sau,

<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> 

bạn sẽ tạo ra không carbon bản nhưng bản nơi @id@name phản ánh số bản sao truyền cho copyNtimes.

(3) Nếu bạn tiếp tục điều chỉnh xsl:apply-template trong copyNtimes để hầm n (XSLT 2.0 bắt buộc),

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

và cũng thêm một mẫu để xử lý itlbcomponents ở phía bên kia của đường hầm,

<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> 

bạn có thể làm việc theo số thành phần vào hậu duệ itlbcomponents.

cập nhật cuối (lần thứ ba) mã hoàn chỉnh và đầu vào mẫu/tài liệu đầu ra XML theo ...

này tài liệu đầu vào 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> 

Với để chuyển đổi XSLT này:

<?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> 

Sẽ mang lại kết quả này X Tài liệu 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

Đó thực sự chính xác là những gì tôi cần cho vấn đề đó! Tôi cũng cần phải thay đổi core0 thành core0, core1, core2, ..., core (n-1) cho từng trường hợp riêng biệt của lõi. –

+0

Đã cập nhật câu trả lời. Bạn đang nhận được hai câu trả lời cho giá của một ở đây. ;-) – kjhughes

+0

Cảm ơn! Điều đó chắc chắn rất hữu ích! Có cách nào, dọc theo cùng một dòng, để áp dụng cùng một logic đó cho các nút con cháu sao cho, ví dụ, trong "system.core4", sẽ có một thành phần "system.core4.itlb" thay vì "system.core0 .itlb " –

Các vấn đề liên quan