私はxmlファイルを持っています。
この xml を xsl ファイルで変換して、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']
どうもありがとう。