Прекратить обработку XML, когда достигнут определенный узел - PullRequest
3 голосов
/ 30 августа 2011

Я создаю форму из 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 остановить обработку XML, когда он достигает следующего узла с @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 Ответ

6 голосов
/ 30 августа 2011

Вот пример 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...