繁体   English   中英

在web页面编辑XML文件,使用PHP存回XML文件

[英]Edit XML file on web page and save back to XML file using PHP

我有一个包含事件列表的 XML 文件,需要通过 web 页面对其进行编辑,提交编辑后的数据后,需要将其保存回 XML 文件。

我已经使用 XSL 文件在 web 页面上显示 XML。 对于每个节点,它显示一个空输入框,右侧显示节点值。 如何让节点值出现在输入文本框内? 以及如何让节点名称出现在输入文本框的左侧?

下一个问题是,一旦它被编辑,我如何才能将它以完全相同的结构存储回 XML 文件中?

还有一件事,我如何添加或删除事件? 谢谢。

这是 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<events>
    <event>
        <id>ev01</id>
        <date>31/12/2020</date>
        <start-time>09:00</start-time>
        <end-time>12:00</end-time>
        <title>Event #1</title>
        <cost>20</cost>
        <venue>London</venue>
        <available-places>10</available-places>
        <updates><![CDATA[We'll post updates here]]></updates>
    </event>
    <event>
        <id>ev02</id>
        <date>31/12/2020</date>
        <start-time>13:00</start-time>
        <end-time>17:00</end-time>
        <title>Event #2</title>
        <cost>20</cost>
        <venue>London</venue>
        <available-places>Sold out</available-places>
        <updates><![CDATA[We'll post updates here]]></updates>
    </event>
</events>

这是 XSL 文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/events">
  <div id="edit_xml">
  <h2>My events</h2>
  <form method="post" action="#edit_xml">
    <xsl:for-each select="event/*">
      <p>
      <input type="text" id="" name="" value="">
      <xsl:value-of select="." />
      </input>
      </p>
    </xsl:for-each>
    <p><input type="submit" name="submit_data" value="Submit"/></p>
  </form>
  </div>
</xsl:template>

</xsl:stylesheet>

要回答您的 XSLT 问题以呈现 HTML 表单:

如何让节点值出现在输入文本框内? 以及如何让节点名称出现在输入文本框的左侧? ... 还有一件事,我如何添加或删除事件?

考虑调整 XSLT 以使用name()并使用表达式赋值: {text()} 甚至用 alignment 的样式将节点名称包装在<label>标签内。此外,使用 XSLT 函数添加唯一的<input> id (用于 CSS/Javascript 识别)和name (用于 PHP 识别): name()position() 为了更好地管理每个事件,将脚本分成eventevents模板

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>
    
    <xsl:template match="/events">
        <div id="edit_xml">
          <h2>My events</h2>
             <form method="post" action="#edit_xml">
                 <xsl:apply-templates select="event"/>
                 <p><input type="submit" name="submit_data" value="Submit"/></p>
             </form>
        </div>
    </xsl:template>
    
    <xsl:template match="event">
        <xsl:for-each select="*">
          <p>
              <label style="display: inline-block;width: 140px;">
                  <xsl:value-of select="name()"/>
              </label>
              <input type="text" id="{concat(name(), position())}" 
                     name="{concat(name(), position())}" 
                     value="{text()}"/>
          </p>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

在线演示

HTML 输出

要删除元素,请在顶层events模板中的<xsl:apply-templates>中运行括号[]条件:

<!-- SELECT ONLY FIRST event TO BE APPLIED -->
<xsl:apply-templates select="event[1]"/>

<!-- SELECT ONLY SECOND event TO BE APPLIED -->
<xsl:apply-templates select="event[2]"/>

<!-- SELECT ALL NODES AFTER FIRST event -->
<xsl:apply-templates select="event[position() &gt; 1]"/>

<!-- SELECT ALL NODES BUT EXCLUDE SECOND NODE -->
<xsl:apply-templates select="event[position() != 2]"/>

<!-- SELECT ONLY LAST event TO BE APPLIED -->
<xsl:apply-templates select="event[last()]"/>

对于这个非 XSLT 问题:

下一个问题是,一旦它被编辑,我如何才能将它以完全相同的结构存储回 XML 文件中?

您需要像 PHP 那样使用应用层处理表单提交,以接收输入值并绑定到 XML 文档中。 事实上,您可以设置另一个具有完全原始布局的 XSLT 解决方案来接收来自 PHP 的参数!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM