2013-02-15 74 views
0

我有一個XML文檔,它構成了一個自動REST測試步驟的一部分。我需要克隆大約一千次的步驟,但文檔中有一個關鍵值需要對每個克隆都是唯一的。什麼是最好的方法 - 腳本,工具或其他什麼,我可以用它來反覆複製,但是爲每個實例改變一個值?我想嘗試編寫一個Java程序來做到這一點,但我沒有在Java中處理XML的經驗,我的理解是解析是一個痛苦。需要隨着值的增加多次克隆XML文檔

更新:目前正在調查XSLT以及它是否適合這種需求。如果您有任何意見或知識,請分享。

回答

0

XSLT 2.0會很好。 (如果你需要一個XSLT 2.0處理器,我會建議Saxon。)

例如,這個簡單的XML文檔:

<doc> 
    <foo/> 
    <bar id="orig-id"/> 
</doc> 

這XSLT 2.0樣式表:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:param name="threshold" select="10"/> 

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

    <xsl:template match="/*/bar/@id" mode="clone"> 
     <xsl:param name="doc-id" tunnel="yes"/> 
     <xsl:attribute name="id" select="$doc-id"/> 
    </xsl:template> 

    <xsl:template match="/" name="createDocs"> 
     <xsl:param name="dashNbr" select="1"/> 
     <xsl:variable name="doc-id" select="concat(generate-id(),'-',$dashNbr)"/> 
     <xsl:result-document href="{$doc-id}.xml"> 
      <xsl:apply-templates select="/*" mode="clone"> 
       <xsl:with-param name="doc-id" select="$doc-id" tunnel="yes"/> 
      </xsl:apply-templates>   
     </xsl:result-document> 
     <xsl:if test="$threshold > $dashNbr"> 
      <xsl:call-template name="createDocs"> 
       <xsl:with-param name="dashNbr" select="$dashNbr + 1"/> 
      </xsl:call-template> 
     </xsl:if> 
    </xsl:template> 

</xsl:stylesheet> 

產生10個文件具有獨特的id屬性。文件名是基於id的。

例子:

d1-1.xml

<doc> 
    <foo/> 
    <bar id="d1-1"/> 
</doc> 

d1-2.xml

<doc> 
    <foo/> 
    <bar id="d1-2"/> 
</doc> 

d1-10.xml

<doc> 
    <foo/> 
    <bar id="d1-10"/> 
</doc> 

你只需要改變的值3210參數設置爲要創建的文件數量,並更改要修改的屬性的match