0

自動化された REST テスト ステップの一部を構成する XML ドキュメントがあります。ステップを約 1000 回複製する必要がありますが、各複製で一意にする必要があるキー値がドキュメントに 1 つあります。最善の方法は何ですか?スクリプト、ツールなど、何度もコピーするために使用できますが、インスタンスごとにその1つの値を変更できますか? これを行うために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>

固有のid属性を持つ 10 個のファイルを生成します。ファイル名は 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>

paramの値をthreshold作成したいファイルの数に変更し、変更しmatchたい属性の を変更するだけで済みます。

于 2013-02-15T18:05:01.750 に答える