我有一个 xml 文件。
我用一个 xsl 文件转换这个 xml 以生成一个 html 表单。
我在这个表单中有多个输入,所以我不知道给他们什么属性名称。由于我必须获取表单的数据,因此我需要相关的名称来识别每个输入。
我尝试了几种解决方案,但都没有成功。
这是 XML 文件:
<typedata id="post" label="Post" >
<data name="titre" label="Titre" type="text" occurrence="1" />
<data name="date" label="Date" type="abstract" occurrence="1" >
<data name="jour" label="Jour" type="text" occurrence="1" >
<attribut name="lol" label="Lol" />
</data>
<data name="mois" label="Mois" type="text" occurrence="1" />
<data name="annee" label="Année" type="text" occurrence="1" />
</data>
<data name="thumbnail" label="Thumbnail Url" type="text" occurrence="1" >
<attribut label="Thumbnail alt" name="alt" />
</data>
<data name="extrait" label="Extrait" type="textarea" occurrence="1" />
</typedata>
这是 XSL 文件:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:str="http://exslt.org/strings"
extension-element-prefixes="str">
<xsl:output
method="html"
indent="yes"
encoding="UTF-8"
/>
<xsl:template match="typedata" >
<input type="hidden" name="id" value="{@id}" />
<!-- ID TypeData -->
<label for="idTypeData" >ID TypeData : </label>
<input type="text" id="idTypeData" name="idTypeData" value="{@id}" /><br />
<!-- Label TypeData -->
<label for="labelTypeData" >Label TypeData : </label>
<input type="text" id="labelTypeData" name="labelTypeData" value="{@label}" /><br />
<!-- Parcourir les data du type -->
<xsl:apply-templates select="data" />
</xsl:template>
<!-- Template Data -->
<xsl:template match="data" >
<fieldset>
<legend><xsl:value-of select="@label" /></legend>
<!-- Titre -->
<label for="{generate-id(@name)}" >Nom : </label>
<input type="text" name="{generate-id(@name)}" id="{generate-id(@name)}" value="{@name}" />
<!-- Label -->
<label for="{generate-id(@label)}" >Label : </label>
<input type="text" name="{generate-id(@label)}" id="{generate-id(@label)}" value="{@label}" />
<!-- Type -->
<label for="{generate-id(@type)}" >Type : </label>
<select name="{generate-id(@type)}" id="{generate-id(@type)}">
<xsl:call-template name="optionsType" >
<xsl:with-param name="type" >
<xsl:value-of select="@type" />
</xsl:with-param>
</xsl:call-template>
</select>
<!-- Occurrence -->
<label for="{generate-id(@occurrence)}" >Occurrence : </label>
<select name="{generate-id(@occurrence)}" id="{generate-id(@occurrence)}">
<xsl:call-template name="optionsOccurrence" >
<xsl:with-param name="occurrence" >
<xsl:value-of select="@occurrence" />
</xsl:with-param>
</xsl:call-template>
</select>
<!-- Attributs -->
<fieldset>
<legend>Attributs</legend>
<xsl:for-each select="attribut" >
<fieldset>
<legend><xsl:value-of select="@label" /></legend>
<!-- Name -->
<label for="{generate-id(@name)}" >Nom : </label>
<input type="text" id="{generate-id(@name)}" name="{name(ancestor::node())}" value="{@name}" />
<br />
<!-- Label -->
<label for="{generate-id(@label)}" >Label : </label>
<input type="text" id="{generate-id(@label)}" name="{generate-id(@label)}" value="{@label}" />
<br />
</fieldset>
</xsl:for-each>
</fieldset>
<!-- Enfants -->
<fieldset>
<legend>Contient</legend>
<xsl:apply-templates select="data" />
</fieldset>
</fieldset>
</xsl:template>
<!-- Template Options Type -->
<xsl:template name="optionsType" >
<xsl:param name="type" />
<!-- Option text -->
<xsl:element name="option" >
<xsl:attribute name="value" >text</xsl:attribute>
<!-- Mettre l'option en sélectionnée si demandé -->
<xsl:if test="$type = 'text'" >
<xsl:attribute name="selected" />
</xsl:if>
<xsl:text>Text</xsl:text>
</xsl:element>
<!-- Option textarea -->
<xsl:element name="option" >
<xsl:attribute name="value" >textarea</xsl:attribute>
<!-- Mettre l'option en sélectionnée si demandé -->
<xsl:if test="$type = 'textarea'" >
<xsl:attribute name="selected" />
</xsl:if>
<xsl:text>Textarea</xsl:text>
</xsl:element>
<!-- Option Abstract -->
<xsl:element name="option" >
<xsl:attribute name="value" >abstract</xsl:attribute>
<!-- Mettre l'option en sélectionnée si demandé -->
<xsl:if test="$type = 'abstract'" >
<xsl:attribute name="selected" />
</xsl:if>
<xsl:text>Abstract</xsl:text>
</xsl:element>
</xsl:template>
<!-- Template Options Occurrence -->
<xsl:template name="optionsOccurrence" >
<xsl:param name="type" />
<!-- Option 1 -->
<xsl:element name="option" >
<xsl:attribute name="value" >1</xsl:attribute>
<!-- Mettre l'option en sélectionnée si demandé -->
<xsl:if test="$type = '1'" >
<xsl:attribute name="selected" />
</xsl:if>
<xsl:text>de 1 à 1</xsl:text>
</xsl:element>
<!-- Option ? -->
<xsl:element name="option" >
<xsl:attribute name="value" >?</xsl:attribute>
<!-- Mettre l'option en sélectionnée si demandé -->
<xsl:if test="$type = '?'" >
<xsl:attribute name="selected" />
</xsl:if>
<xsl:text>de 0 à 1</xsl:text>
</xsl:element>
<!-- Option * -->
<xsl:element name="option" >
<xsl:attribute name="value" >*</xsl:attribute>
<!-- Mettre l'option en sélectionnée si demandé -->
<xsl:if test="$type = '*'" >
<xsl:attribute name="selected" />
</xsl:if>
<xsl:text>de 0 à infini</xsl:text>
</xsl:element>
<!-- Option + -->
<xsl:element name="option" >
<xsl:attribute name="value" >+</xsl:attribute>
<!-- Mettre l'option en sélectionnée si demandé -->
<xsl:if test="$type = '+'" >
<xsl:attribute name="selected" />
</xsl:if>
<xsl:text>de 1 à infini</xsl:text>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
这会产生一个这样的 HTML 表单(这是一个摘录,表单可以更大)
<fieldset>
<legend>Date</legend>
<label for="id942230">Nom : </label>
<input type="text" name="id942230" id="id942230" value="date">
<label for="id942274">Label : </label>
<input type="text" name="id942274" id="id942274" value="Date">
<label for="id942185">Type : </label>
<select name="id942185" id="id942185">
<option value="text">Text</option>
<option value="textarea">Textarea</option>
<option value="abstract" selected>Abstract</option>
</select>
<label for="id942245">Occurrence : </label>
<select name="id942245" id="id942245">
<option value="1">de 1 à 1</option>
<option value="?">de 0 à 1</option>
<option value="*">de 0 à infini</option>
<option value="+">de 1 à infini</option>
</select>
<fieldset><legend>Attributs</legend></fieldset>
<fieldset>
<legend>Contient</legend>
<fieldset>
<legend>Jour</legend>
<label for="id942231">Nom : </label>
<input type="text" name="id942231" id="id942231" value="jour">
<label for="id942236">Label : </label>
<input type="text" name="id942236" id="id942236" value="Jour">
<label for="id942224">Type : </label>
<select name="id942224" id="id942224">
<option value="text" selected>Text</option>
<option value="textarea">Textarea</option>
<option value="abstract">Abstract</option>
</select>
<label for="id942347">Occurrence : </label>
<select name="id942347" id="id942347">
<option value="1">de 1 à 1</option>
<option value="?">de 0 à 1</option>
<option value="*">de 0 à infini</option>
<option value="+">de 1 à infini</option>
</select>
<fieldset>
<legend>Attributs</legend>
<fieldset>
<legend>LoL</legend>
<label for="id942327">Nom : </label>
<input type="text" id="id942327" name="" value="lol"><br>
<label for="id942342">Label : </label>
<input type="text" id="id942342" name="id942342" value="LoL">
</fieldset>
</fieldset>
<fieldset><legend>Contient</legend></fieldset>
</fieldset>
</fieldset>
</fieldset>
如您所见,我将 generate-id 赋予名称。但它不起作用,因为 ID 每次都在变化。
我搜索了一种可以在 PHP 中轻松找到的名称的好方法。
在 PHP 中,我需要指定数据 ex:
$_POST['Label of Attribute LoL in the Data Jour in the Data Date']
非常感谢。