1

私は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']

どうもありがとう。

4

2 に答える 2

0

このスタイルシートを試して、目的に近いかどうかを確認してください。generate-id()の代わりにを使用しているため、一意のIDが必要だと思いますname()。名前付きテンプレートを追加し、numberこのような式で使用するために変数で呼び出しました

{concat(name(@label),'-',$number}

これがスタイルシートです。

<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" >
    <xsl:variable name="number">
      <xsl:call-template name="number"/>
    </xsl:variable>
    <fieldset>
      <legend><xsl:value-of select="@label" /></legend>

      <!-- Titre -->
      <label for="{concat(name(@name),'-',$number)}" >Nom : </label>
      <input type="text" name="{concat(name(@name),'-',$number)}" id="{concat(name(@name),'-',$number)}" value="{@name}" />

      <!-- Label -->
      <label for="{concat(name(@label),'-',$number)}" >Label : </label>
      <input type="text" name="{concat(name(@label),'-',$number)}" id="{concat(name(@label),'-',$number)}" value="{@label}" />

      <!-- Type -->
      <label for="{concat(name(@type),'-',$number)}" >Type : </label>
      <select name="{concat(name(@type),'-',$number)}" id="{concat(name(@type),'-',$number)}">
        <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="{concat(name(@occurrence),'-',$number)}" >Occurrence : </label>
      <select name="{concat(name(@occurrence),'-',$number)}" id="{concat(name(@occurrence),'-',$number)}">
        <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" >
          <xsl:variable name="attribut-number">
            <xsl:call-template name="number"/>
          </xsl:variable>

          <fieldset>
            <legend><xsl:value-of select="@label" /></legend>

            <!-- Name -->
            <label for="{concat(name(@name),'-',$attribut-number)}" >Nom : </label>
            <input type="text" id="{concat(name(@name),'-',$attribut-number)}" name="{concat(name(@name),'-',$attribut-number)}" value="{@name}" />
            <br />

            <!-- Label -->
            <label for="{concat(name(@label),'-',$attribut-number)}" >Label : </label>
            <input type="text" id="{concat(name(@label),'-',$attribut-number)}" name="{concat(name(@label),'-',$attribut-number)}" 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:template name="number">
    <xsl:number count="data|attribut" level="any"/>
  </xsl:template>

</xsl:stylesheet>
于 2012-11-18T07:01:17.353 に答える
0

助けてくれてありがとう !

必要なものを正確に取得するためにソリューションを調整しました:

(属性「id」の「データ」ノードの「名前」属性を変更しますが、それは問題ではありません)

テンプレート番号は次のとおりです。

<xsl:template name="number">
    <xsl:number count="data|attribut" level="multiple"/>
</xsl:template>

データ ノードのラベルと入力の xslt は次のとおりです。

<label for="{concat(name(@id),'-',$number)}" >Nom : </label>
<input type="text" name="{concat($number,'-','data','-',name(@id))}" id="{concat(name(@id),'-',$number)}" value="{@id}" />

属性ノードのラベルと入力の xslt は次のとおりです。

 <label for="{concat(name(@id),'-',$attribut-number)}" >Nom : </label>
 <input type="text" name="{concat($attribut-number,'-','att','-',name(@id))}" id="{concat(name(@id),'-',$attribut-number)}" value="{@id}" />

このコードでnames属性に得られるものの例:

2-data-id-> データ ノード n°2 の id 属性

2.1-data-label-> データ ノード n°2 内のデータ ノード n°1 のラベル属性

2.1.2.1-att-id-> データノード n°2 のデータノードの属性ノード n°1 の id 属性など

したがって、この名前属性を使用すると、php でそれらを簡単に制御できます。助けてくれてありがとう

于 2012-11-18T17:17:43.983 に答える