属性値に基づいて XML 要素を生成する必要があります。私は使用します<xsl:call-template>
。しかし、無限ループで終わります。次の条件に基づいて、要素に基づい<colspec>
た値を持つ要素を生成する必要があります。 1. 要素の文字列長に基づいて要素を生成します。値の発生に基づいて、cols 属性に 'l' がある場合は align="left" または cols 属性に 'r' がある場合は align='right'<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>