2011-08-30 55 views
3

我从XML创建表单。我有以下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时,我无法停止处理XML。下面是结果我想创造:

<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结构(我不能改变它)?

回答

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> 
+0

辉煌!不知道为什么我没有尝试过使用'key()'和'generate()'。干杯。 –

相关问题