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

标签 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当 XML 到达下一个节点 @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>

这是否可以使用当前的 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>

关于xml - 到达某个节点时停止处理 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7246733/

相关文章:

Android:ids.xml 与到处使用 @+id/id_name

java - 写入xml文件

java - 在 XmlObject 中添加数据

XSLT1.0/XPath 1.0 按日期范围选择节点。这可能吗?

xml - xslt 异常 - 来自 <xsl :/> tag 的属性值

python - XPath:转换为小写并同时规范化空间

xml - XPATH 表达式获取 XML 文件名

xml - 如何检查 XSLT 中是否存在值

python - 从 XML 内容生成静态 HTML 站点

xml - Xpath函数去除空格