在xslt中动态创建XML标记名称

时间:2014-01-16 17:38:27

标签: xml xslt

我有一个带有整数的数字参数 numberOfFileds 。 我需要使用以下结构创建 numberOfFileds +1 XML节点:

<CONT_CUST_FLD_00X>
    <xsl:value-of
            select="./platformCore:customField[@internalId='custrecord_ebiz_container_custfield_00X']/platformCore:value"/>
</CONT_CUST_FLD_00X>

其中 X - 数字从 0 numberOfFileds

因此,例如,当 numberOfFileds = 3时,可预测的输出必须如下:

<CONT_CUST_FLD_000>
    <xsl:value-of
            select="./platformCore:customField[@internalId='custrecord_ebiz_container_custfield_000']/platformCore:value"/>
</CONT_CUST_FLD_000>
<CONT_CUST_FLD_001>
    <xsl:value-of
            select="./platformCore:customField[@internalId='custrecord_ebiz_container_custfield_001']/platformCore:value"/>
</CONT_CUST_FLD_001>
<CONT_CUST_FLD_002>
    <xsl:value-of
            select="./platformCore:customField[@internalId='custrecord_ebiz_container_custfield_002']/platformCore:value"/>
</CONT_CUST_FLD_002>
<CONT_CUST_FLD_003>
    <xsl:value-of
            select="./platformCore:customField[@internalId='custrecord_ebiz_container_custfield_003']/platformCore:value"/>
</CONT_CUST_FLD_003>

请帮助我通过编写适当的xslt模板来实现这一点。

2 个答案:

答案 0 :(得分:2)

您可以将{em>属性值模板用于name的{​​{1}}属性,以创建具有计算名称的元素。我会像这样解决问题:

xsl:element

当然,这可能是模板,而不是for-each。

答案 1 :(得分:0)

我选择了另一种解决问题的方法:

这是我的模板:

<xsl:template name="createFieldsAuto">
    <xsl:param name="newTagName"/>
    <xsl:param name="internaIdValue"/>
    <xsl:param name="numberOfFields"/>
    <xsl:param name="cycleIndex" select="0"/>
    <xsl:if test="number($cycleIndex) &lt;= number($numberOfFields)">
        <xsl:variable name="a" select="concat($internaIdValue, $cycleIndex)"/>
        <xsl:element name="{concat($newTagName, $cycleIndex)}">
            <xsl:value-of
                    select="./platformCore:customField[@internalId=concat($internaIdValue, $cycleIndex)]/platformCore:value"/>
        </xsl:element>
        <xsl:call-template name="createFieldsAuto">
            <xsl:with-param name="newTagName" select="$newTagName"/>
            <xsl:with-param name="internaIdValue" select="$internaIdValue"/>
            <xsl:with-param name="numberOfFields" select="$numberOfFields"/>
            <xsl:with-param name="cycleIndex" select="$cycleIndex + 1"/>
        </xsl:call-template>
    </xsl:if>
</xsl:template>

以下是我称之为的方式:

<!--the template below helps us to generate sections like these:-->

<!--<BILL_INFO_CUST_FLD_000 ></BILL_INFO_CUST_FLD_000 >-->
<!--<BILL_INFO_CUST_FLD_001 ></BILL_INFO_CUST_FLD_001 >-->
<!--<BILL_INFO_CUST_FLD_002 ></BILL_INFO_CUST_FLD_002 >-->

<!--example of using is the following:-->

<xsl:variable name="custFields_SH_CUST">
    <xsl:call-template name="createFieldsAuto">
        <xsl:with-param name="newTagName" select="'CONT_CUST_FLD_00'"/>
        <xsl:with-param name="internaIdValue" select="'custrecord_ebiz_container_custfield_00'"/>
        <xsl:with-param name="numberOfFields" select="9"/>
    </xsl:call-template>
</xsl:variable>
<xsl:copy-of select="$custFields_SH_CUST"/>