我需要根据属性值生成 XML 元素。我用<xsl:call-template>
. 但以无限循环结束。我需要根据以下条件生成<colspec>
具有基于元素的值的元素: 1.根据元素的字符串长度生成元素 2. 还要为colname='col1' colnum='1' 等元素生成属性,最后align="left" 如果 cols 属性具有 'l' 或 align='right' 如果 cols 属性具有 'r' 基于值的出现<tgroup>
<colspec>
<colspec>
示例 XML:
<table>
<tgroup cols="lr">
<thead>
<row>
<entry>H1</entry>
<entry>H1</entry>
</row>
</thead>
<tbody>
<row>
<entry>B1</entry>
<entry>B2</entry>
</row>
</tbody>
</tgroup>
</table>
输出 XML:
<table>
<tgroup cols="2">
<colspec colnum="1" colname="col1" align="left"/>
<colspec colnum="2" colname="col2" align="right"/>
<thead>
<row>
<entry>H1</entry>
<entry>H1</entry>
</row>
</thead>
<tbody>
<row>
<entry>B1</entry>
<entry>B2</entry>
</row>
</tbody>
</tgroup>
</table>
我在 XSLT 下试过:
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="tgroup">
<xsl:copy>
<xsl:attribute name="cols">
<xsl:value-of select="string-length(@cols)"/>
</xsl:attribute>
<xsl:call-template name="colsp">
<xsl:with-param name="cols_details" select="@cols"/>
<xsl:with-param name="cols_count" select="string-length(@cols)"/>
</xsl:call-template>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template name="colsp">
<xsl:param name="cols_details"/>
<xsl:param name="cols_count"/>
<xsl:if test="$cols_count != 0">
<xsl:variable name="single_col" select="substring($cols_details,1,1)"/>
<xsl:variable name="cols_details1" select="substring-after($cols_details,$single_col)"/>
<xsl:variable name="cols_count1" select="string-length($cols_details)"/>
<colspec colnum="{$cols_count1-$cols_count}" colname="col{$cols_count1}" align="{$align}"/>
<xsl:call-template name="colsp">
<xsl:with-param name="cols_details1"/>
<xsl:with-param name="cols_count1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>