1

我有一个 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']

非常感谢。

4

2 回答 2

0

试试这个样式表,看看它是否更接近你想要的。我假设您需要唯一的 ID,因为您使用generate-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”更改了“data”节点的“name”属性,但没关系)

这是模板编号:

<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}" />

使用此代码在我的名称属性中获得的示例:

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 回答