Xpoint
   [напомнить пароль]

Изменить XML с помощью XSL

Метки: [без меток]
2007-08-28 18:30:44 [обр] Алексей[досье]

Допустим есть xml (абсолютно любой) c секцией Documents:

<Documents>
   <Document no="1">
   <Document no="2">
   <Document no="3">
</Documents>

как мне средствами xsl добавить в уже существующий XML документ еще одну запись, например <Document no="4">. Непонятно как задать входной и выходной файлы.
Спасибо

спустя 44 минуты [обр] Dennis F. Latypoff aka funky_dennis(10/78)[досье]
<xsl:element name="Document">
  <xsl:attribute name="no">4</xsl:attribute>
</xsl:element>
спустя 28 минут [обр] Алексей[досье]
Это понятно, но при такой записи изменения в XML не сохранятся. И если я открою пойзже этот документ, то он будет иметь лишь 3 секции Document.
спустя 3 минуты [обр] Алексей Севрюков(14/1280)[досье]
Алексей[досье] А в XML разве есть функции сохранения файлов? Помоему Вы сами руками должны это делать или нет?
спустя 3 минуты [обр] Алексей[досье]
Ну как я пока понимаю, что бы сохранить изменения в измененном XML файле, надо написать код на Яве и вставить её в CData. Пока понял токма это.
спустя 6 минут [обр] Алексей Севрюков(14/1280)[досье]
Алексей[досье] Кого ее?
спустя 2 часа 53 минуты [обр] Алексей[досье]
её - код :)
спустя 25 минут [обр] Алексей Севрюков(14/1280)[досье]

Алексей[досье] Ну примерно так, только CDATA не совсем понятно зачем.
Т.е. берете язык программирования на котором практикуете:

  1. Открываете исходный xml
  2. проводите трансформацию как было сказано выше
  3. сохраняете результат на диск в этот же либо в другой файл.

Если у Вас имеются вопросы по одному из пунктов, пишите в раздел по тому языку, на котором пишите - там Вам помогут.

спустя 1 час 37 минут [обр] coldseed[досье]

Алексей, не рассматривайте трансформацию XSLT как преобразование исходного файла.

Трансформер просто получает один XML на входе и выводит на выходе другой. Что касается действий по "поставке" этого самого входящего XML трансформеру XSLT и сохранению результатов трансформации в файле или по выдаче в браузер клиента (или в другой поток) - все это выходит за рамки темы XML/XSLT.

Про файлы.
В каждом языке есть свои средства работы с файлами. Кстати, насчет JavaScript не уверен.

Про формирование XML.
Если действия ведутся на стороне клиента - используйте DOM XML, т.к. XSLT - это трансформер (преобразователь), работающий по четкой логике, с некоторым определенным изначально (до трансформации) набором данных, а не генератор данных.

Формирование исходного XML - это задача, решаемая не средствами XSLT, а функциональностью DOM XML на соответствующем языке.

спустя 2 минуты [обр] coldseed[досье]
Поправка к написанному выше:
"Если действия ведутся на стороне клиента..." - можно не читать:) Все равно, где формируется исходный XML, всяко не в XSLT. По крайней мере в подавляющем большинстве ситуаций.
спустя 1 час 34 минуты [обр] Алексей[досье]
Спасибо всем за внимание, но попробую объяснить кривизну ситуации:
Всё это ВебПриложение. Есть сервис который следит за определенной папкой и как только файл в нее попадает он его обрабатывает и кладет в другую папку. Все это написано на С#. Попутно создается лог файл, и запись в него осуществляется с помощью xslt файла, содержащего секцию CDATA.
<![CDATA[
<msxsl:script implements-prefix="javascript" language="JavaScript">
    function loadDocument(url)
    {
        var DOM = new ActiveXObject("MSXML2.DOMDocument.4.0");
        DOM.load(url) ;
        return DOM ;
    }
]]></msxsl:script>
Вызывается он как-то так:
<xsl:param name="original.path"/>
.......
<xsl:template match="/">
<xsl:variable name="Original" select="javascript:loadDocument (string($original.path))"/>
Но этот код полностью перезаписывает файл, а не добавляет инфу в существующий.
Понятно что прописать строку в С# проще, но у меня нет доступа к этому коду. Поэтому я и хотел разобраться и похожими инструментами перезаписать свой xml. Но с Явой практически не работал. Отсюда и вопрос.
спустя 10 часов [обр] coldseed[досье]

Странная конечно задача, но если она действительно состоит в том, что надо средствами javascript добавить в DOM-дерево, полученное от сервера, новый элемент, то:

  1. "new ActiveXObject..." - не кроссбраузерно
  1. с готовым dom этого документа можно сделать что-то вроде такого:

...
var domdoc = new DOMDocument();
newnode = domdoc.createElement("Document");
newnode.setAttribute("no", "4");

documentsNode = domdoc.getElementByTagName("Documents"); // можно искать узел любым способом, getElementByTagName - как вариант
documentsNode.appendChild(newnode);
...

И тут XSLT ни при чем.

В C# (в MSXML) есть свои, другие, чем в JS, средства для работы с DOM XML.

Проблема решилась бы быстрее, если бы больше было бы известно про контекст задачи.

спустя 1 день [обр] Алексей[досье]
В принципе начал понимат как это работает. Только не могу понять, вроде getElementByTagName отсутствует в MSXML2. А присутствует лишь MSXML3. Какие похожие методы есть в MSXML2 для поимки тэга по имени?
спустя 1 час 8 минут [обр] Dennis F. Latypoff aka funky_dennis(10/78)[досье]
-getElementByTagName
+getElementsByTagName
Powered by POEM™ Engine Copyright © 2002-2005