嗨,我有以下要求。
需要根据元素值重复每一个。
<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> '
答案 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>