使用xslt 1.0基于重复元素的表单组

时间:2014-11-11 19:05:44

标签: xml xslt

嗨,我有以下要求。

需要根据元素值重复每一个。     <foreachvalue>3</foreachvalue>

和3组xmls

`<source>
<foreachvalue>3</foreachvalue>
<cycle1>BMW</cycle1>
<cycle2>Merc</cycle2>
<cycle3>Ferrari</cycle3>
<cycle1color>red</cycle1color>
<cycle2color>green</cycle2color>
<cycle3color>yello</cycle3color>
<cycle1backwheelsize>10</cycle1backwheelsize>
<cycle1frontwheelsize>11</cycle1frontwheelsize>
<cycle2backwheelsize>09</cycle2backwheelsize>
<cycle2frontwheelsize>19</cycle2frontwheelsize>
<cycle3backwheelsize>39</cycle3backwheelsize>
<cycle3frontwheelsize>32</cycle3frontwheelsize>
</source>` 

需要在xml

下面形成xslt
`<target>
<CycleData>
<cycle1>BMW</cycle1>
<cycle1color>red</cycle1color>
<cycle1backwheelsize>10</cycle1backwheelsize>
</CycleData>
<CycleData>
<cycle1>BMW</cycle1>
<cycle1color>red</cycle1color>
<cycle1frontwheelsize>11</cycle1frontwheelsize>
</CycleData>
<CycleData>
<cycle2>Merc</cycle2>
<cycle2color>green</cycle2color>
<cycle2backwheelsize>09</cycle2backwheelsize>
</CycleData>
<CycleData>
<cycle2>Merc</cycle2>
<cycle2color>green</cycle2color>
<cycle2frontwheelsize>19</cycle2frontwheelsize>
</CycleData>
<!-- Rest Cycle Data -->
</terget>`

如果您需要更多详细信息,请告诉我

     '  <target>
        <CycleData/>
        <CycleData/>
        <CycleData>
        <cycle3>Ferrari</cycle3>
        <cycle3color>yello</cycle3color>
        <cycle3backwheelsize>39</cycle3backwheelsize>
        <cycle3frontwheelsize>32</cycle3frontwheelsize>
        </CycleData>
        </target> '

1 个答案:

答案 0 :(得分:0)

在很长一段时间内,这可能是这种情况下的统治逻辑,您可能想尝试以下样式表。

它将创建N <CycleData>个元素,其中N是<foreachvalue>节点的值。

然后它将查看源文档中每个元素名称中包含的仅数字,如果结果字符串与N匹配,则会将该元素复制到相应的{{1} }。

XSLT 1.0

<CycleData>

结果,当应用于您的示例输入时:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:key name="elem-by-num" match="*" use="translate(local-name(), translate(local-name(), '0123456789', ''), '')" />

<xsl:template match="/">
    <target>
        <xsl:call-template name="create-cycles">
            <xsl:with-param name="n" select="source/foreachvalue"/>
        </xsl:call-template>
    </target>
</xsl:template>

<xsl:template name="create-cycles">
    <xsl:param name="n"/>
    <xsl:if test="$n > 0">
        <xsl:call-template name="create-cycles">
            <xsl:with-param name="n" select="$n - 1"/>
        </xsl:call-template>        
        <CycleData>
            <xsl:copy-of select="key('elem-by-num', $n)"/>
        </CycleData>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>