从HTML表创建XML文件?

时间:2014-04-23 09:27:19

标签: php html xml xslt

目前我有一个XML文件和XSL文件。 XSL文件获取XML文件并在HTML中创建可编辑的表。我现在需要做的是能够单击一个按钮,表值保存在一个新的XML文件中。这样做的最佳方法是什么?似乎PHP对于制作XML文件很有用,但不知道如何从XSL制作的表中获取值。我希望用XSL做,但如果不是JavaScript或PHP。如果有人可以指出我正确的方向,即使只是告诉我哪种语言可以做到这一点我会非常感激。

XSL:

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
    <table border="2">
        <tr>
            <th>firstname</th>
            <th>lastname</th>
            <th>age</th>
        </tr>

        <xsl:for-each select="people/person">
        <tr>
            <td><span contenteditable="true"><xsl:value-of select="firstname"/></span></td>         
            <td><span contenteditable="true"><xsl:value-of select="lastname"/></span></td>
          <td><span contenteditable="true"><xsl:value-of select="age"/></span></td>


        </tr>
        </xsl:for-each>
    </table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

我想要的XML格式:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="table.xsl"?>
<people>
    <person>
        <firstname>John</firstname>
        <lastname>Johnson</lastname>
        <age>20</age>
    </person>   
</people>

更新:从这里Getting value from table cell in javascript...not jquery我现在得到一个值列表,但它们包含span标记,所以我得到了<span contenteditable="true">John</span>。如何删除span标签,以便我得到“John”?以下是我正在使用的JavaScript。

function GetCellValues()
{
    var table = document.getElementById('mytable');
    for (var r = 0, n = table.rows.length; r&lt;n; r++)
    {
        for (var c = 0, m = table.rows[r].cells.length; c&lt;m; c++)
        {
            alert(table.rows[r].cells[c].innerHTML);
        }
    }
}

2 个答案:

答案 0 :(得分:1)

在考虑某些事物的转变之前,你需要掌握的两个问题是:

  • 如何将数据恢复到服务器
  • 如何确保如果某人发送了垃圾邮件,那么您的服务器代码不会崩溃(例如将&lt;&gt;添加到单元格内容或JavaScript中等等。

通常您使用HTML表单,但这并不适用于您的情况,因此您需要拥有JavaScript并且可能需要Ajax调用。要收集您的数据,您可以使用:

    function getCellValues() {
            var total = [];
            var table = document.getElementById('mytable');
            for (var r = 0; r < table.rows.length; r++) {
                var oneRow = [];
                for (var c = 0; c < table.rows[r].cells.length; c++) {
                    oneRow.push(table.rows[r].cells[c].children[0].innerHTML);
                }
                total.push(oneRow);
            }
            // Here you would post it;
            alert(JSON.stringify(total));
        }

一些指示:

  • 除了在Java中,在JavaScript行结尾被评估为自动分号插入,所以如果你的开放括号在同一行(好)或下一行(不太好),它会有所不同
  • 此处的函数收集二维JavaScript数组。根据您的特定需求,您可能希望构建一组更具体的JavaScript对象(参见下文)
  • 与Java一样,我们通常以小写
  • 启动函数
  • 在服务器端,您仍需要清理输入
  • 有很多更好的方法可以做到这一点 - 它们带有学习曲线:Dojo,jQuery,AngularJS

更好的收藏方式:

    function getCellValues() {
            var total = [];
            var table = document.getElementById('mytable');
            for (var r = 0; r < table.rows.length; r++) {
                var oneRow = {};
                oneRow.firstName = table.rows[r].cells[0].children[0].innerHTML;
                oneRow.lastName = table.rows[r].cells[1].children[0].innerHTML;
                oneRow.age = table.rows[r].cells[2].children[0].innerHTML;
                total.push(oneRow);
            }
            // Here you would post it;
            alert(JSON.stringify(total));
        }

希望有所帮助。 (P.S。:JSON对象中的构建仅在decent browsers

答案 1 :(得分:0)

如果您希望HTML元素的内容为纯文本,请使用textContent属性(在大多数浏览器中实现的W3C DOM)或innerText属性(旧的IE版本),例如

function getTextContent(element) {
  return typeof element.textContent != 'undefined' ? element.textContent : element.innerText;
}

function GetCellValues()
{
    var table = document.getElementById('mytable');
    for (var r = 0, n = table.rows.length; r&lt;n; r++)
    {
        for (var c = 0, m = table.rows[r].cells.length; c&lt;m; c++)
        {
            alert(getTextContent(table.rows[r].cells[c]));
        }
    }
}

getTextContent函数中的检查可能需要进行改进以适应所有类型的浏览器,以防一个人既不实现textContent也不实现innerText,在这种情况下是递归的遍历所有文本后代节点可以提供帮助。