Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / нужна помощь... / 7 сообщений из 7, страница 1 из 1
03.07.2007, 20:12
    #34636277
Nick_ola
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нужна помощь...
Люди помогите пожалуйста.
Необходимо написать преобразование(при помощи xsl) которое из такого xml файла:

<programlisting>
<codeline lineno="23">
<highlight class="preprocessor"></highlight>
<highlight class="preprocessor">#define<sp/>текст1<sp/>текст2</highlight>
</codeline>
<codeline lineno="24">
<highlight class="preprocessor"></highlight>
<highlight class="normal"></highlight>
</codeline>
<codeline lineno="25">
<highlight class="normal"></highlight>
<highlight class="preprocessor">#ifndef<sp/>LOG_PERROR<sp/>255</highlight>
</codeline>
<codeline lineno="26" refid="compat_8h_1542160b84335cc94dfb75604fd40d341" refkind="member">
<highlight class="preprocessor"></highlight>
<highlight class="preprocessor">#define<sp/>LOG_PERROR<sp/>0</highlight>
</codeline>
<codeline lineno="29">
<highlight class="normal"></highlight>
<highlight class="preprocessor">#ifhhndef<sp/>SA_NOCLDWAIT</highlight>
</codeline>
<codeline lineno="30" refid="compat_8h_1e4c1aad864ef72e4a2cce74b1b8a5a0b" refkind="member">
<highlight class="preprocessor"></highlight>
<highlight class="preprocessor">#define<sp/>SA_NOCLDWAIT<sp/>0</highlight>
</codeline>
</programlisting>

Делало бы следующую табличку, в которой для каждого <highlight class="preprocessor"> начинающегося(или содержащего) с #define было:

23(взято из codeline lineno="23">) текст1 текст2
26 LOG_PERROR 0
30 SA_NOCLDWAIT 0
и.т.д.

Я мучаюсь уже неделю(ибо чайник в XSLT) и ничаво не получается…..

Заранее спасибо!!!
...
Рейтинг: 0 / 0
04.07.2007, 10:06
    #34636880
Nick_ola
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нужна помощь...
Вот пример покороче:
<programlisting>
<codeline lineno="23">
<highlight class="preprocessor"></highlight>
<highlight class="preprocessor">#define<sp/>текст1<sp/>текст2</highlight>
</codeline>
<codeline lineno="24">
<highlight class="preprocessor">bbbb</highlight>
<highlight class="normal">ccccc</highlight>
</codeline>
<codeline lineno="25">
<highlight class="normal"></highlight>
<highlight class="preprocessor">#define<sp/>текст3<sp/> текст4</highlight>
</codeline>
</programlisting>


Нужно получить:
23(взято из codeline lineno="23">) текст1 текст2
25 текст3 текст4

Попробовал написать вот так:

<xsl:template match="/">
<xsl:variable name="varStartWith">#def</xsl:variable>
<xsl:for-each select="programlisting/codeline/highlight[@class='preprocessor']">
<xsl:variable name="varhighlight">
<xsl:value-of select="."/>
</xsl:variable>
<xsl:if test="contains($varhighlight,$varStartWith)">
<xsl:text>string</xsl:text>
<xsl:value-of select="..//@lineno"/>
<xsl:value-of select="."/>
</xsl:if>
</xsl:for-each>
</xsl:template>

Выдает следующее:
String23 #defineтекст1текст2
String25 #define текст3текст4


Как бы разделить текст1 и текст2(каким-нибудь знаком или в отдельный столбец) и убрать #define???(очевидно основываясь на обработке </sp> в роли разделителя)
...
Рейтинг: 0 / 0
04.07.2007, 11:51
    #34637300
qu-qu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нужна помощь...
Nick_olaЛюди помогите пожалуйста...
... Я мучаюсь уже неделю(ибо чайник в XSLT) и ничаво не получается…..

Если ты "чайник в XSLT", то - на первый раз прощается...
А на будущее запомни - XSLT не "императивный" язык (где надо писать циклы, заводить переменные и вызывать "подпрограммы" с параметрами), а - "декларативный", т.е. тебе нужно четко "в голове" представлять что ты именно хочешь получить (а не - как ), а потом - только записать свои пожелания в терминах шаблонов + предикатов XPath.
Типа так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output encoding="UTF-8" standalone="no" method="text" omit-xml-declaration="yes" indent="no"/>

<xsl:template match="/">
	<!-- 1. начиная с корня - обработать все элементы кода препроцессора -->
	<xsl:apply-templates select="//highlight[@class='preprocessor']"/>
</xsl:template>

<!-- 2. если код препроцессора начинается с #define - вывести номер строки и продолжить обработку текстовых узлов (не забыть разделитель строк a-la CR_LF). -->
<xsl:template match="highlight[@class='preprocessor'][text()[1]='#define']">
	<xsl:value-of select="../@lineno" />
	<xsl:apply-templates select="text()"/>
	<xsl:text>&# 013 ;&# 010 ;</xsl:text>
</xsl:template>

<!-- 3. обрабатывать текстовые узлы кода препроцессора, "выкидывая" первый (собственно #define) -->
<xsl:template match="highlight[@class='preprocessor']/text()">
	<xsl:if test="not(position()=1)">
		<!-- 4. добавить разделитель между значениями текстовых узлов (в данном случае - табуляция) -->
		<xsl:text>&# 009 ;</xsl:text><xsl:value-of select="." />
	</xsl:if>
</xsl:template>

</xsl:stylesheet>
И все... (кстати, этот вариант решения - далеко не единственный, т.к. "декларативность" XSLT предполагает только адекватное описание "цели" преобразования, но никак не ограничивает способов ее достижения).
...
Рейтинг: 0 / 0
05.07.2007, 08:54
    #34639782
Nick_ola
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нужна помощь...
Спасибо огромное за ответ!

Но применительно к вот этому:

<programlisting>
<codeline lineno="33">
<highlight class="normal"/>
<highlight class="preprocessor">#include<sp/>"<ref refid="lib_8h" kindref="compound">lib.h</ref>"</highlight>
<highlight class="normal"/>
</codeline>
<codeline lineno="39">
<highlight class="normal"/>
<highlight class="preprocessor">#ifdef<sp/>HAVE_SHAPER<sp/>
</highlight>
</codeline>
<codeline lineno="78">
<highlight class="normal"/>
<highlight class="preprocessor">#ifndef<sp/>timersub</highlight>
</codeline>
</programlisting>

Твоя версия(xsl) выдает следующее:

"lib.h " HAVE_SHAPER timersub

Интересно что нужно поправить чтобы не было реакции на это?
...
Рейтинг: 0 / 0
05.07.2007, 11:17
    #34640255
qu-qu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нужна помощь...
Nick_ola... Интересно что нужно поправить чтобы не было реакции на это?
Ну, добавить можно вот это:
Код: plaintext
1.
2.
3.
4.
5.
6.
...
<xsl:template match="/">
	<!-- 1. начиная с корня - обработать все элементы кода препроцессора -->
	<xsl:apply-templates select="//highlight[@class='preprocessor'][text()[1]='#define']" />
</xsl:template>
...
Суть в том, что директива <xsl:apply-templates select="//highlight[@class='preprocessor']" /> действительно дает указания перебирать именно все элементы highlight с атрибутом class со значением 'preprocessor' (прошу прощения за некоторую "небрежность" в коде примера).
Однако же, "глыбже" по ходу обработки дерева элементов - нет никаких указаний xslt-процессору (шаблонов) как именно обрабатывать эти элементы.
В моем примере есть только 2 более "специализированных" шаблона:
2. для элементов, у которых первый текстовый узел = "#define";
3. для дочерних текстовых узлов обрабатываемых элементов.
"Правильный" парсер (xslt-процессор) в этом случае (если нет шаблона для обработки, зато есть указание от "<xsl:apply-templates ..." обрабатывать эти элементы) применяет т.н. "преобразование по-умолчанию", которое заключается в том, что в выходной поток "тупо" пишется содержимое всех текстовых узлов всех дочерних (и "внучатых") элементов от обрабатываемого (именно поэтому в вывод "нового" примера "пролезла" lib.h).
Вобщем, правило простое - чем более четко специфицируются в шаблонах правила перебора элементов, тем меньше вариантов "левого" вывода в выходной поток.
В вашем "упрощенном" примере - единственный элемент без "#define" имел и единственный текстовый узел "bbbb", который при обработке шаблона игнорировался по условию "not(position()=1)", что создало у меня ложное представление о "правильности" поверхностного решения...

З.Ы. "на всякого мудреца - довольно простоты" © не мой
...
Рейтинг: 0 / 0
05.07.2007, 16:49
    #34641760
Nick_ola
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нужна помощь...
qu-qu еще раз спасибо!:-)

Теперь вот такой вопрос:

Имеется xsl, директория с xml файлами, нужно их всех обработать и на выходе получить один txt (дабы потом преобразовать xls), как сие лучше проделать?
...
Рейтинг: 0 / 0
05.07.2007, 19:06
    #34642279
qu-qu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нужна помощь...
Nick_ola... Имеется xsl, директория с xml файлами, нужно их всех обработать и на выходе получить один txt (дабы потом преобразовать xls), как сие лучше проделать?
Да как угодно...
написать скрипт на VBS/JS, который переберет все файлы xml в каталоге, преобразует их с помощью xsl-шаблона и "сольет" в одну большую текстовую строку, которую потом же в файл и сохранит;

скачать с сайта мелкомягких утилиту msxsl.exe и написать BAT/CMD файлик, который сделает почти то же самое, но средствами командной строки;

написать свою собственную утилиту на C#/VB.NET с той же функциональностью (там парсер немного более "продвинутый", чем "стандартный" msxml.dll);

да мало ли еще как...
Если у вас xml файлы не 100-"метровых" размеров, то все предложенные способы не будут особо критичны по ресурсам и времени исполнения.
Если же файлы действительно большие, а производительность решения важна - тогда придется вам разбираться с методами SAX-обработки xml и выстраивать свои собственные преобразования на потоковом переборе элементов... (но, к xslt это уже не имеет никакого отношения).
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / нужна помощь... / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]