我正在使用XML创建表单。我有以下XML:
<data>
<personal-info type="legend" label="Personal Info"/>
<first-name type="field" label="First Name"/>
<last-name type="field" label="Last Name"/>
<settings-info type="legend" label="Settings Info"/>
<timezone type="field" label="Timezone"/>
</data>
等于@type
的 legend
个属性表示应创建新fieldset
的位置。我遇到的问题是,当fieldset
到达@type
等于legend
的下一个节点时,我无法让第一个<fieldset>
<legend>Personal Info</legend>
<label>First Name</label>
<input type="text" name="first-name" />
<label>Last Name</label>
<input type="text" name="last-name" />
</fieldset>
<fieldset>
<legend>Settings Info</legend>
<label>TimeZone</label>
<input type="text" name="timezone" />
</fieldset>
停止处理XML。这是我想要创建的结果:
{{1}}
这是否可以使用当前的XML结构(我无法更改它)?
答案 0 :(得分:6)
以下是XSLT示例:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:key name="k1" match="data/*[not(@type = 'legend')]" use="generate-id(preceding-sibling::*[@type = 'legend'][1])"/>
<xsl:template match="data">
<xsl:apply-templates select="*[@type = 'legend']"/>
</xsl:template>
<xsl:template match="data/*[@type = 'legend']">
<fieldset>
<legend>
<xsl:value-of select="@label"/>
</legend>
<xsl:apply-templates select="key('k1', generate-id())"/>
</fieldset>
</xsl:template>
<xsl:template match="data/*[@type = 'field']">
<label>
<xsl:value-of select="@label"/>
</label>
<input type="text" name="{local-name()}"/>
</xsl:template>
</xsl:stylesheet>