Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > count(document(...)/test)


Автор: StepS 9.3.2006, 12:57
проблема в следующем:
есть вызов в xslt:
Код

<count>
    <xsl:value-of select="count(document('Styles.xml')/*)"/>
</count>


так вот..... в результате получаем <count>0</count>
styles.xml такого вида:
Код

<test>
    <Style ID = "ID_Department_1">
        <condition>
            <element>ID_Department</element>
            <cond>. = 1</cond>
        </condition>
    </Style>
    <Style ID = "ID_Department_2">
        <condition>
            <element>ID_Department</element>
            <cond>. = 2</cond>
        </condition>
    </Style>
</test>


этот xml-ник лежит там же где и xslt, не могу понять почему не отрабатывает !"!
Help please smile

Автор: Beard 9.3.2006, 14:08
А каким процессором пользуешься?

Автор: StepS 9.3.2006, 14:12
msxml, делаю преобразование спомощью .NET на C#. FrameWork 1.1

Автор: Beard 9.3.2006, 14:34
А через командную строку с msxml работает?
(У меня с 4.0, например, все прекрасно работает)

Автор: StepS 9.3.2006, 15:06
интересный прикол обнаружил: если делать трансформацию спом какой-нить проги, типа XmlSpy - работает, если делать трансформацию спомощью C# кода XslTransform.Transform() - то не работает.
Кто знает в чем бок !!!?
Метод трансформации следующий:
Код

    public static void XsltTransform(string cXmlFile, string cXslFile, string cOutFile, XsltArgumentList xsltArguments) {
            try{
                XslTransform oXslTransform = new XslTransform();
                oXslTransform.Load(cXslFile, null);
                StreamWriter oWriter = new StreamWriter(cOutFile);
                XmlDataDocument oXmlDocument = new XmlDataDocument();
                oXmlDocument.Load(cXmlFile);
                oXslTransform.Transform(oXmlDocument, xsltArguments, oWriter, null);
            }catch(XsltException e) {
                MessageBox.Show(e.StackTrace);
            }
         }

smile

Автор: Beard 9.3.2006, 15:15
Видать зависит от того, в какой директории работает прога - по другому резолвятся URI до файла.
На Java из-за этого у некоторых и появляются проблемы при использовании функции document или при импорте/инклюде

Автор: Beard 9.3.2006, 16:07
Попробуй использовать класс XmlResolver
и делай Load, используя его

Автор: StepS 10.3.2006, 13:41
у меня тоже появились проблемы при Include, это что глюк framework-а или "ошибка в моем ДНК" ? smile
встречает инструкцию include и выкидывает exception.
Кто как выходил из ситуации ?? Хелп плизз smile

Автор: Beard 10.3.2006, 13:48
А что по поводу XmlResolver?
Попробовал?
У меня просто нет на этом PC VS, а то я бы сделал это сам

Автор: StepS 10.3.2006, 15:08
вроде с include-ми получилось, теперь гемор пошел в другом:
когда я сделал трансформашку я результат выкинул в Stream, потом пытаюсь сделать XmlDocument.Load(oStream) говорит что нет корневого елемента, хотя когда делаю сохранение в файл этого стрима то файл вполне валидный.

З.Ы. Спасибо за XmlResolver

Автор: Beard 10.3.2006, 15:11
Уверен, что валидный?
Можно на начало посмотреть?

Автор: StepS 10.3.2006, 15:34
Код

<?xml version="1.0" encoding="utf-8"?>
<root xmlns:step="urn:step">
    <Form>
        <ID_Department>1</ID_Department>
        <Department>Хирургия</Department>
        <OnChangeBegin>0</OnChangeBegin>
        <OpenBed>10</OpenBed>
        <RepareBed>0</RepareBed>
    </Form>
....
</root>

Автор: Beard 10.3.2006, 15:42
Да, выглядит прилично!

А если сохранить в файл (раз он там получается валидным), а потом сделать

XmlDocument::Load(string filename)

Будет ли такая же ошибка?
Добавлено @ 15:44
И если будет, то можно ее полный текст увидеть?

Автор: StepS 10.3.2006, 16:39
ошибки такой не будет, уже пробовал. Втом то весь и прикол smile smile
через файл работает ! но я хочу без файла обойтись

Автор: Beard 10.3.2006, 16:43
Тогда на текст первой ошибки не плохо было бы взглянуть
Добавлено @ 16:53
Кстати, а ты Flush стриму делаешь?
Добавлено @ 16:56
Вот, нашел - надо сделать stream.Position=0

Автор: StepS 10.3.2006, 17:07
заработало, спасибо !
Только зачем такой геммор нужно делать ? smile

Автор: Beard 10.3.2006, 17:14
Для writer-ов flush (или Close) - чтобы они все свои буферы очистили в приемник.
А про Position (может навру, я в основном джавист), могу предположить:
когда читаются данные, то он смещается. Ну а вдруг мне захотелось в середину чего-нить запихнуть?
Беру, смещаю Pointer, и радуюсь.
Но при этом не стоит забывать его выставлять "на старт" (т.е. Position=0), если мы хотим
извлечь из него все с самого начала

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)