0

我有一个 XML 文档,它构成了自动化 REST 测试步骤的一部分。我需要克隆该步骤大约一千次,但是文档中有一个键值需要对每个克隆都是唯一的。最好的方法是什么 - 脚本、工具或其他任何东西,我可以用来一遍又一遍地复制它,但为每个实例更改一个值?我曾想过尝试编写一个 java 程序来做到这一点,但我没有在 java 中处理 XML 的经验,我的理解是解析很痛苦。

更新:目前正在研究 XSLT 以及它是否适合这种需要。如果您有任何意见或知识,请分享。

4

1 回答 1

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>

您只需要将threshold参数的值更改为要创建的文件数,然后更改match要修改的属性。

于 2013-02-15T18:05:01.750 回答