我正在从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>
Run Code Online (Sandbox Code Playgroud)
@type等于的属性legend指示fieldset应在何处创建新的.我遇到的问题是,fieldset当它到达下一个@type等于的节点时,我无法让第一个停止处理XML 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>
Run Code Online (Sandbox Code Playgroud)
这是否可以使用当前的XML结构(我不能改变它)?
这是一个示例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>
Run Code Online (Sandbox Code Playgroud)