XSLT - ваш друг для преобразования файла базы данных XML в формат, который вы хотите отобразить на веб-странице. Вы создаете шаблон XSL, который включает в себя весь HTML-код, который вы хотите для каждой записи, а затем перебираете файл XML с оператором for-each. Я дам приблизительный обзор и могу помочь с более подробной информацией, если это необходимо.
Вот общий файл PHP, который я использую для выполнения XSLT (обработки файла XML с файлом XSL) через AJAX. Это настройка для работы с необходимыми (и необязательными, если необходимо) входами, передаваемыми в вызове GET из браузера. p # n и p # v (см. комментарии вверху кода ниже) - это пары параметров и значений, которые должны передаваться в документ XSL в тех случаях, когда вы хотите использовать какой-либо входной параметр, чтобы повлиять на вывод. В этом случае выходные данные возвращаются в браузер. Вот PHP для запуска базы данных XML и XSLT-преобразование для создания HTML-кода для вашего веб-дисплея (таблицы или чего-либо еще, что вы поместили в шаблон файла XSL):
<?php
//REQUIRED INPUTS:
// - xml: path to xml document
// - xsl: path to xsl style sheet
// - pCount: number of parameters to be passed to xslt (send zero '0' if none)
//OPTIONAL INPUTS (must have as many as specified in pCount, increment '1' in
//names below up a number for each iteration):
// - p1n: name of first parameter
// - p1v: value of first parameter
//SET Paths
$xmlPath = $_GET['xml'];
$xslPath = $_GET['xsl'];
// Load the XML source
$xml = new DOMDocument;
$xml->load($xmlPath);
$xsl = new DOMDocument;
$xsl->load($xslPath);
// Configure the transformer
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl); // attach the xsl rules
//Set Parameter(s), if present
$xslParamCount = $_GET['pCount']; //Check number of xsl parameters specified in GET
for ($i=1; $i<=$xslParamCount; $i++){
$xslParamName = $_GET['p'.$i.'n'];
$xslParamValue = $_GET['p'.$i.'v'];
$proc->setParameter( '', $xslParamName, $xslParamValue); //Set parameters for XSLTProcessor
}
// TRANSFORM
echo $proc->transformToXML($xml);
// SET Mime Type
$mime = "application/xhtml+xml";
$charset = "iso-8859-1";
header("Content-Type: $mime;charset=$charset");
?>
Ниже приведен пример шаблона файла XSL, принимающего документ базы данных XML и преобразующего его в HTML для вставки на веб-страницу. Обратите внимание на теги HTML span. Все теги xsl являются инструкциями по обработке, которые определяют, что входит в теги HTML в шаблоне и вокруг них. В этом случае мы фильтруем результаты и выбираем подходящие данные для отображения на основе входных параметров, передаваемых в файл XSL (см. Элементы xsl: param вверху):
<?xml version='1.0' encoding='UTF-8'?>
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
<xsl:param name='testId'/>
<!--Input options for following param: localUse, notLocalUse, nottestId, or '' (all)-->
<xsl:param name='matchType'/>
<xsl:template match='/'>
<xsl:choose>
<xsl:when test="$matchType='localUse'">
<xsl:for-each select="//test[@id=$testId and @localUse='yes']">
<xsl:sort select="../@id"/>
<div><xsl:if test='../@localPrefTestId=$testId'><xsl:attribute name='class'>preferredTest</xsl:attribute></xsl:if>
<span class='productStockCode'>
<xsl:if test='../@localPrefTestId=$testId'>
<xsl:attribute name='title'>Preferred test for this product</xsl:attribute>
</xsl:if>
<xsl:if test='../@localPrefTestId!=$testId'>
<xsl:attribute name='title'>Alternate (not preferred) test for this product - see note to right</xsl:attribute>
</xsl:if>
<xsl:value-of select='../@id'/>
</span>
<span class='productStockName'>
<xsl:if test='../@localPrefTestId=$testId'>
<xsl:attribute name='title'>Preferred test for this product</xsl:attribute>
</xsl:if>
<xsl:if test='../@localPrefTestId!=$testId'>
<xsl:attribute name='title'>Alternate (not preferred) test for this product - see note to right</xsl:attribute>
</xsl:if>
<xsl:value-of select='../@name'/>
</span>
<span class='producttestNote'>
<xsl:value-of select='child::localPrefNote'/>
</span>
<span class='productDeleteButton'>
<input onClick='remProdLink(this)' title='Click to remove link to this product' type='image' src='button_tiny_X_grey.bmp'></input>
</span>
</div>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<p>Server Error: GET must specify matchType parameter value of 'localUse', 'notLocalUse', 'nottestId', or '' (for all)</p>
<p>matchType received: <xsl:value-of select='$matchType'/></p>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!--Note the output method="html" below is required for this to insert correctly into a web page; without this it may nest improperly if any divs are empty-->
<xsl:output method="html" omit-xml-declaration="yes"/>
</xsl:stylesheet>
Обратите внимание, что все тесты xsl являются выражениями XPath.
Чтобы удалить строку, у вас может быть кнопка в этой строке, которая вызывает функцию JavaScript с аргументом this (см. OnClick = 'remProdLink (this)' в приведенном выше коде) для ссылки на строку, а затем захватывает уникальный Идентификатор строки в JavaScript примерно так:
function remProdLink(obj){
//get unique id via Dom from passed in object reference
//edit everything after "obj" below to get to the unique id in the record
var testCode = obj.parentNode.parentNode.firstChild.nextSibling.innerHTML;
//code to send AJAX POST to server with required information goes here
}
На стороне сервера ваш PHP получает AJAX POST с уникальным идентификатором, загружает файл базы данных XML в simpleXml, находит узел через XPath и удаляет его, что-то вроде этого:
<?php
//Move url encoded post data into variables
$testCode = $_POST['testCode']; //$testCode should be a unique id for the record
//load xml file to edit
$xml = simplexml_load_file('yourDatabase.xml');
//find target node for removal with XPath
$targets = $xml->xpath("//testCode[@id=$testCode]");
//import simpleXml reference into Dom to do removal
$dom2 = dom_import_simplexml($targets[0]);
$dom2->parentNode->removeChild($dom2);
//format xml to save indented tree (rather than one line) and save
$dom = new DOMDocument('1.0');
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($xml->asXML());
$dom->save('yourDatabase.xml');
?>
Что касается редактирования элемента, у вас может быть другая функция JavaScript, вызываемая аналогично той, которая используется для удаления, как отмечено выше, создать форму под этим элементом на веб-странице с помощью кнопки сохранения изменений, а когда эта кнопка нажата, вызвать другую Функция JavaScript для AJAX POST на сервере, опять же, аналогично удалению. Только на этот раз ваш POST должен будет включать всю информацию, которая могла быть отредактирована в записи, вместе с уникальным идентификатором записи. PHP-файл найдет соответствующую запись (так же, как и для удаления), а затем вы можете либо отредактировать части этой записи в PHP, либо просто удалить ее и создать и добавить новую версию записи.
Я не уверен, сколько деталей вам нужно. Надеюсь, это даст вам хорошее начало. Пожалуйста, прокомментируйте мой ответ, если вам нужна более подробная информация о какой-либо его части. Удачи!