到达某个节点时停止处理XML

时间:2011-08-30 16:42:20

标签: xml xslt xpath

我正在使用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结构(我无法更改它)?

1 个答案:

答案 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>