Вход

Просмотр полной версии : Связывание строки HTML- и Xml- таблиц


LaGor
18.05.2002, 10:22
Есть таблица данных. Структура на Xml представлены HTML.
Мышкой выбираю строку нужно узнать, что находиться внутри ячеек.
Вообще это не обязательно с помощью Xml, может кто знает другие способы? Я пришёл к выводу, что у меня никак не получиться кроме как с помощью Xml, правда у меня и так не особо получается ... :(

Stellerex
18.05.2002, 12:43
Бред какой-то. Шел бы ты, молодой человек, в раздел DHTML, - xml тебе не нужен, да и работать то, что ты хочешь будет только под IE.

LaGor
18.05.2002, 13:21
Ну, во-первых, то что это будет только под IE, меня вполне устраивает.
Во-вторых, согласен я слабо знаю xml (недавно за него взялся), тогда тем более я нуждаюсь в совете. Поэтому ответ "... бред какой-то ... шёл бы ты ... (хоть и признателен что указали конечный пункт) ..." является по меньше мере не уважительным.
В-третьих, объясниле бы тогда почему с помощью xml это сделать нельзя.

Согласен может не понятно задал вопрос, перефразирую.
Есть набор данных табличного типа. С помощью Xml структуированых. Потом связываю Xml данные с HTML-элементом Table. Получается HTML таблица с данными. Как передвигать курсор объекта recordset DSO знаю. Но как связать строку в HTML таблице со строкой данных Xml в recordset'е (нужно же знать на сколько передвинуть курсор у объекта recordset), чтобы вынуть значения, я не знаю.
И просьба не надо отвечать "отписками" не имеющих конструктивных подсказок.

Stellerex
18.05.2002, 13:49
Ок, попробую ответить конструктивно.
Предположим, есть у тебя xml следующего вида:

<?xml version="1.0" encoding="UTF-8"?>
<tableinfo>
<row id="1">
<column>1</column>
<column>2</column>
<column>3</column>
</row>
<row id="2">
<column>4</column>
<column>5</column>
<column>6</column>
</row>
</tableinfo>


, описывающий твои данные в табличной форме. Предположим, что ты сделал xsl'ку, выполняющую трансформацию этого xml'я в html:


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="tableinfo">
<script language="javascript">
function doRowClick(row_id) {
alert('row with id=' + row_id + ' clicked');
}
</script>

<table>
<html>
<head>
<title>Sumthin' blablabla<title>
</head>
<body>
<xsl:apply-templates select="row"/>
</table>
</body>
</html>
</xsl:template>

<xsl:template match="row">
<tr rowid="{@id}" onclick="doRowClick('{@id}')">
<xsl:apply-templates select="row"/>
<tr>
</xsl:template>

<xsl:template match="column">
<td><xsl:value-of select="."><td>
</xsl:template>

</xsl:stylesheet>


Собственно, все. После этого, при тычке на любую строку в таблице вызывается джаббаскриптовая функа doRowClick() с параметром - идентификатором строки. Опосля этого через document DOM обращайся к любому элементу этой строки.

Насчет "Бред какой-то" могу пояснить буквально следующее. Твою постановку задачи я прочитал четыре(4) раза и не понял, что конкретно тебе надо. Такое, согласись, бывает не часто :)

П.С. Приведенный код, скорее всего, без напильника работать не будет - не проверял.

Stellerex
18.05.2002, 13:54
Ну да, одну багу уже видать невооруженным глазом:
в темплейте row

<xsl:apply-templates select="row"/>

надо заменить на

<xsl:apply-templates select="column"/>

:)

LaGor
18.05.2002, 15:17
Stellerex я действительно плохо знаю xml (точнее сказать я его практически и не знаю). Поэтому у меня возникли некоторые трудности. Я сделал эти два файла, вроде все ошибки исправил, но как из них получить конечный html файл? (может это и покажется смешно). Просто у тебя как-то всё наоборот сделано. Я обычно делал html файл в нём подключал xml, а в xml указывал на xsl, т.е. в конечном счёте получался html. Видишь дело в чём мне надо получить один html файл в конечном итоге. (поясню: у меня на сервере обрабатываются данные, формируется html-документ и отправляется клиенту от которого был запрос)
Может проще будет если я напишу как делал, а ты посмотришь и подскажешь?
Пусть xml будет встроен в html.


<HTML>
<Head><Title>Тест</Title></Head>
<body>
<xml id="dsoTableData">
<?xml version="1.0"?>
<TableData>
<row>
<fld1>1.1</fld1>
<fld2>1.2</fld2>
<fld3>1.3</fld3>
</row>
<row>
<fld1>2.1</fld1>
<fld2>2.2</fld2>
<fld3>2.3</fld3>
</row>
<row>
<fld1>3.1</fld1>
<fld2>3.2</fld2>
<fld3>3.3</fld3>
</row>
</TableData>
</xml>
<table datasrc="#dsoTableData" border="1">
<tr>
<td><span datafld="fld1"></span></td>
<td><span datafld="fld2"></span></td>
<td><span datafld="fld3"></span></td>
</tr>
</table>
</body>
</HTML>


Получается что в элементе table определена тока одна строка, когда браузер отображает таблицу, он повторяет строковые элементы для каждой записи в Xml.
Ну дак вот вопрос в таком случае я не могу проиндефецировать каждые элемент tr (пронумеровать их по порядку), иначе можно было бы передвинуть курсор объекта recordset на нужный бы номер Xml данных по типу
dsoTableData.recordset.move([индекс строки]) ...

Прошу прощения, как-то сумбурно получилось, но может всё таки более понятно чем в предыдущие разы.

Stellerex
18.05.2002, 15:42
На мой взгляд, ты излишне усложняешь жизнь - если не требуется жуткого интерактива на странице, без ее перезагрузки, выполнять трансформацию xml -> html через xslt лучше всего на сервере. Клиенту в этом случае приходит чистый html-код, скрывающий реализацию. Пример на c#:

protected String getXMLTransformResult() {
XmlDocument doc = new XmlDocument();
XmlDocument result = new XmlDocument();
XmlNode node = result.AppendChild(result.CreateElement("root"));

XmlDocument stylesheet = new XmlDocument();
XslTransform transform = new XslTransform();

XsltArgumentList arguments = new XsltArgumentList();
fillXsltArgumentList(ref arguments);

doc.Load(Server.MapPath(@"data/properties.xml"));
stylesheet.Load(Server.MapPath(@"data/properties.xsl"));
transform.Load(stylesheet);

XmlReader reader = transform.Transform(doc, arguments);
for (reader.Read(); !reader.EOF; )
node.AppendChild(result.ImportNode(doc.ReadNode(reader), true));
reader.Close();

return node.InnerXml;
}


Аналогично делается на java, php етс.
Естественно, xml не обязательно грузить с диска :)
Если же ты маньяк и все трансформации позарез надо делать на клиенте, вот пример из MSDN:


<SCRIPT LANGUAGE="JScript">

var oMenuXml = new ActiveXObject("Microsoft.XMLDOM");
oMenuXml.async = false;
oMenuXml.load("webdev.xml");

var oMenuXsl = new ActiveXObject("Microsoft.XMLDOM");
oMenuXsl.async = false;
oMenuXsl.load("menus_1.xsl");

</SCRIPT>
</HEAD>
<BODY>
<SCRIPT LANGUAGE="JScript">

document.write(oMenuXml.transformNode(oMenuXsl.documentElement));

</SCRIPT>

LaGor
20.05.2002, 16:53
Мне и надо чтобы всё происходило на сервере, а клиенту посылался Html-файл (таблица с данными). А когда он выбирает строку у таблицы, данные из этой строки дальше обрабатываются в другой страничке (т.е. передаются).
Честно говоря,я не совсем понял что ты тут написал. :(
Извини. Просто С## я не знаю, а xml плохо (что почти аналогично). Не мог бы ты объяснить поподробнее?
Ещё раз извини, если напрягаю.

Stellerex
20.05.2002, 19:26
Ну тогда поступим так - напиши подробнее, откуда берешь данные и на чем пишешь серверную часть - может подмогну исходником. Можно по аське :)

LaGor
21.05.2002, 08:25
Хорошо, давай по асе, а потом сюда выложим исходник, вдруг кому понадобиться.