【问题标题】:give a useful name to inputs in a form created by xslt为 xslt 创建的表单中的输入提供有用的名称
【发布时间】:2012-11-17 23:42:38
【问题描述】:

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

非常感谢。

【问题讨论】:

    标签: php xml forms xslt


    【解决方案1】:

    试试这个样式表,看看它是否更接近你想要的。我假设您需要唯一的 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>
    

    【讨论】:

      【解决方案2】:

      感谢您的帮助!

      我调整了您的解决方案以获得我所需要的:

      (我把“data”节点的“name”属性改成属性“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}" />
      

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

      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 中控制它们。谢谢九九的帮助!

      【讨论】:

      • 小心!与 $_POST,“。”变成“_”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      • 1970-01-01
      • 2019-05-23
      • 1970-01-01
      • 2013-01-31
      • 2021-12-19
      • 1970-01-01
      相关资源
      最近更新 更多