如何使用XSLT为每个HTML select设置唯一name属性解决PHP $_POST数据问题
解决重复select name导致PHP无法获取数据的问题
我来帮你搞定这个问题——核心是在XSLT生成表单的过程中,给每组重复的select元素的name属性加上唯一的序号标识,这样PHP的$_POST就能正确区分各组数据了。下面是具体的实现步骤:
1. 在XSLT中生成带唯一序号的name属性
假设你的XML结构是包含多组需要生成表单的数据(比如用<group>节点分组),你可以利用XSLT的position()函数来获取当前循环的位置,把它拼接到name属性后面。
示例XML结构
<survey> <group id="1"> <!-- 第一组的相关数据 --> </group> <group id="2"> <!-- 第二组的相关数据 --> </group> <group id="3"> <!-- 第三组的相关数据 --> </group> </survey>
修改后的XSLT代码
在遍历每组数据时,给select的name拼接position()的值:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <form method="post" action="your-save-script.php"> <!-- 遍历每组数据 --> <xsl:for-each select="survey/group"> <div class="form-group"> <!-- 生成带序号的Correct select --> <select name="Correct{position()}"> <option value="yes">Yes</option> <option value="no">No</option> </select> <!-- 生成带序号的ErrorOne select --> <select name="ErrorOne{position()}"> <option value="typo">Typo</option> <option value="logic">Logic Error</option> </select> <!-- 生成带序号的ErrorTwo select --> <select name="ErrorTwo{position()}"> <option value="missing">Missing Data</option> <option value="invalid">Invalid Value</option> </select> </div> </xsl:for-each> <button type="submit">Save Data</button> </form> </xsl:template> </xsl:stylesheet>
这样生成的HTML表单中,第一组的select会是name="Correct1"、name="ErrorOne1"、name="ErrorTwo1",第二组对应Correct2,以此类推,完全满足唯一标识的需求。
2. PHP端获取并保存数据
在PHP脚本中,你可以通过循环来遍历每组带序号的字段,把数据写入新的XML文件:
<?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 假设你知道总共有3组数据,或者可以从XML/表单隐藏域获取组数 $totalGroups = 3; // 创建新的XML文档 $newXml = new DOMDocument('1.0', 'UTF-8'); $newXml->formatOutput = true; $root = $newXml->createElement('submittedData'); $newXml->appendChild($root); // 遍历每组数据 for ($i = 1; $i <= $totalGroups; $i++) { $groupNode = $newXml->createElement('group'); // 获取当前组的三个select值 $correct = $_POST["Correct$i"] ?? ''; $errorOne = $_POST["ErrorOne$i"] ?? ''; $errorTwo = $_POST["ErrorTwo$i"] ?? ''; // 添加到XML节点 $groupNode->appendChild($newXml->createElement('Correct', $correct)); $groupNode->appendChild($newXml->createElement('ErrorOne', $errorOne)); $groupNode->appendChild($newXml->createElement('ErrorTwo', $errorTwo)); $root->appendChild($groupNode); } // 保存到新XML文件 $newXml->save('submitted-data.xml'); echo "Data saved successfully!"; } ?>
备选方案:使用数组形式的name属性
如果你不想处理序号,也可以直接把name设置为数组格式(比如name="Correct[]"),这样PHP会自动把所有同名的select值收集到一个数组里:
XSLT修改
<select name="Correct[]"> <!-- 选项内容 --> </select> <select name="ErrorOne[]"> <!-- 选项内容 --> </select> <select name="ErrorTwo[]"> <!-- 选项内容 --> </select>
PHP处理
<?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { $correctValues = $_POST['Correct'] ?? []; $errorOneValues = $_POST['ErrorOne'] ?? []; $errorTwoValues = $_POST['ErrorTwo'] ?? []; $newXml = new DOMDocument('1.0', 'UTF-8'); $newXml->formatOutput = true; $root = $newXml->createElement('submittedData'); $newXml->appendChild($root); // 遍历数组处理每组数据 foreach ($correctValues as $index => $correct) { $groupNode = $newXml->createElement('group'); $groupNode->appendChild($newXml->createElement('Correct', $correct)); $groupNode->appendChild($newXml->createElement('ErrorOne', $errorOneValues[$index] ?? '')); $groupNode->appendChild($newXml->createElement('ErrorTwo', $errorTwoValues[$index] ?? '')); $root->appendChild($groupNode); } $newXml->save('submitted-data.xml'); echo "Data saved successfully!"; } ?>
这种方法更简洁,不需要关心具体的组数,适合动态生成的表单组。
内容的提问来源于stack exchange,提问作者Avartil
相关产品推荐
相关产品推荐

