Модераторы: diadiavova

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> xml+xsl+xsd 
V
    Опции темы
Compositum
Дата 29.3.2012, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Доброго времени суток. 

К топику прилагаю архив с несколькими файлами. Файлы представляют собой простенький тестовый пример, в котором я пытаюсь к xml-файлу прикрутить xsl и xsd. 
Суть проблемы в том, что если я из xml-файла удаляю информацию о привязке к xsd, то в браузере получаю корректно отформатированное, верное представление документа (license.xml). Однако при наличии привязки к xsd - в браузере я получаю неверное представление информации (т.е. вместо текста лицензии вижу сообщение о том, что лицензия пуста). 

Либо я ошибся в коде xsd, либо не правильно пытаюсь привязать xsd к xml. Буду весьма признателен за помощь.

С уважением Андрей.

Это сообщение отредактировал(а) Compositum - 29.3.2012, 10:33

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  sample.zip 3,91 Kb
PM   Вверх
Compositum
Дата 29.3.2012, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



я обновил архив - нашел в xsd файле несколько опечаток и ошибку (помог IDE MS VS 2010) smile... Но проблема осталась... :(
PM   Вверх
diadiavova
Дата 29.3.2012, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Compositum, из того, что бросается в глаза в документе вот это не правильно
Код

xsi:schemaLocation="http://www.pupkin.autocad.com/apps license.xsd"

Этот атрибут должен содержать набор пар "префикс - пространство имен", а для пространств без префикса используется атрибут xsi:noNamespaceSchemaLocation

Ну и главное - это само преобразование, оно совершенно ничего не знает о пространстве имен, описанном в схеме и все выражения xpath оно относит к элементам пустого пространства. Надо подключить к преобразованию пространство схемы (желательно с префиксом) и в выражениях при указании элемента использовать этот префикс. А в корне документа используй атрибут exclude-result-prefixes.



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Compositum
Дата 29.3.2012, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Спасибо за ответ. Я обновил архив - добавил в xsd-файл определение типа langType.
С помощью этого кода проверил свой xml-файл на предмет его соответствия xsd-схеме. Проверка прошла успешно... Однако в браузере по прежнему депрессия.

Используемый мною атрибут (schemaLocation) я срисовал из книги Дига Тидуэлла. С этим атрибутом всё прекрасно работает по указанному мною выше коду. Я не понял насчёт "префикс - пространство имен" - можете пример показать? Я ведь указал у себя своё пространство имён используемым по умолчанию, т.о. путаниц с префиксами возникать не должно. 

Это сообщение отредактировал(а) Compositum - 29.3.2012, 10:42
PM   Вверх
diadiavova
Дата 29.3.2012, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Цитата(Compositum @  29.3.2012,  11:41 Найти цитируемый пост)
Я ведь указал у себя своё пространство имён используемым по умолчанию

А причем тут это? Каким образом данное расположение схемы должно с этим пространством ассоциироваться?
Цитата(Compositum @  29.3.2012,  11:41 Найти цитируемый пост)
Я не понял насчёт "префикс - пространство имен" - можете пример показать? 

Не префикс, а пространство-местоположение
http://msdn.microsoft.com/ru-ru/library/ms...28VS.90%29.aspx
то есть этот атрибут указывает где надо искать схему для каждого пространства имен и значения его должны быть парными и пробелы должны заменяться последовательностями %20

Но я еще раз повторяю, что это не главная проблема. Главная проблема в файле xslt. Перечитай мой предыдущий пост, я там описал что надо сделать.

Добавлено через 1 минуту и 2 секунды
и кстати сюда тоже загляни
http://msdn.microsoft.com/ru-ru/library/ms...28VS.90%29.aspx


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Compositum
Дата 29.3.2012, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Внёс изменения в XML и XSL файлы...
XML-файл:
Код

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="license.xsl"?>
<license xmlns="http://www.pupkin.autocad.com/apps"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.pupkin.autocad.com/apps license.xsd">
  <positions>
    <position>
      <txt lang="ru-RU">Наименование программы</txt>
      <txt lang="en-US">Program name</txt>
    </position>
    <position>
      <txt lang="ru-RU">Copyright (C) 2012 Вася Пупкин</txt>
      <txt lang="en-US">Copyright (C) 2012 Vasya Pupkin</txt>
    </position>
    <position>
      <txt lang="ru-RU">
        Это свободная программа; вы можете повторно распространять ее и/или
        модифицировать ее в соответствии с Универсальной Общественной Лицензией
        GNU, опубликованной Фондом Свободного ПО; либо версии 3, либо (по вашему
        выбору) любой более поздней версии.
      </txt>
      <txt lang="en-US">
        This program is free software: you can redistribute it and/or modify
        it under the terms of the GNU General Public License as published by
        the Free Software Foundation, either version 3 of the License, or
        (at your option) any later version.
      </txt>
    </position>
  </positions>
</license>

XSL-файл:
Код

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
exclude-result-prefixes="#default"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.pupkin.autocad.com/apps"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.pupkin.autocad.com/apps license.xsd">

  <xsl:output method="html" indent="yes" media-type="text/html" doctype-system="about:legacy-compat"/>

  <xsl:variable name="localization" select="document('lang.xml')/settings/@lang"/>
  <xsl:variable name="resVar" select="document(concat('./localization/license.', normalize-space($localization), '.xml'))"/>

  <xsl:template match="/">
    <html>
      <head>
        <style type="text/css">
          p {text-indent:25px}
        </style>
      </head>
      <body>
        <h2>
          <xsl:value-of select="$resVar/resources/strings/string[@name='license']"/>
        </h2>
        <hr/>
        <xsl:choose>
          <xsl:when test="count(/license/positions/position) &gt; 0">

            <xsl:for-each select="/license/positions/position">
              <p>
                <xsl:value-of select="txt[@lang=$localization]"/>
              </p>
            </xsl:for-each>
          </xsl:when>
          <xsl:otherwise>
            <b>
              <xsl:value-of select="$resVar/resources/strings/string[@name='empty']"/>
            </b>
          </xsl:otherwise>
        </xsl:choose>
        <hr/>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>


Результат по прежнему нулевой. Указал в XSL нужные пространства. Что упустил?

п.с. по указанной ссылке я не понял - что подразумевается под "исключённым пространством имён"? Т.е. элементы этого пространства не будут видны xsl-схемой?

п.с.2 я пробовал и без атрибута exclude-result-prefixes - не помогло.

Это сообщение отредактировал(а) Compositum - 29.3.2012, 11:46
PM   Вверх
diadiavova
Дата 29.3.2012, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Цитата(Compositum @  29.3.2012,  12:30 Найти цитируемый пост)
Внёс изменения в XML и XSD файлы...

 smile У меня такое ощущение, что я сам с собой разговариваю
Цитата(diadiavova @  29.3.2012,  11:19 Найти цитируемый пост)
Ну и главное - это само преобразование

Под преобразованием я конечно же имел в виду XSLT. С первого поста я сказал, что проблема именно в нем. Дальше я это повторил
Цитата(diadiavova @  29.3.2012,  11:52 Найти цитируемый пост)
Но я еще раз повторяю, что это не главная проблема. Главная проблема в файле xslt. Перечитай мой предыдущий пост, я там описал что надо сделать.

И тоже безрезультатно. 
XSD на представление вообще не влияет, его может и не быть в принципе и это никак не отобразится на виде.  smile В данном случае имеет значение только то, что в документе у тебя элементы относятся к одному пространству имен, а в преобразовании к другому, поэтому оно их и не определяет. Каким языком еще надо это повторить?



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Compositum
Дата 29.3.2012, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



в предыдущем сообщении я несколько раз опечатался - вместо 'XSL' написал 'XSD'. исправил.
Цитата

в документе у тебя элементы относятся к одному пространству имен, а в преобразовании к другому, поэтому оно их и не определяет.

это не так. Посмотри внимательней мой предыдущий пост с исходниками XML и XSL. Пространство имён одно и то же.

Это сообщение отредактировал(а) Compositum - 29.3.2012, 11:43
PM   Вверх
diadiavova
Дата 29.3.2012, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Цитата(Compositum @  29.3.2012,  12:41 Найти цитируемый пост)
в предыдущем сообщении я несколько раз опечатался - вместо 'XSL' написал 'XSD'. исправил. 

Я там еще писал, что надо объявлять пространство с префиксом и потом его эксклюдить. Почему не работает для дефолтного пространства - я не знаю, честно говоря просто руки не доходили разобраться в чем дело, но если все делать с префиксом, то должно работать. И схемалокейшн в преобразовании не требуется. По большому счету она и в хмл чаще всего не требуется, все решают пространства имен.

Добавлено через 9 минут и 11 секунд
Вот так попробуй
Код

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:p="http://www.pupkin.autocad.com/apps" exclude-result-prefixes="p">
  <xsl:output method="html" indent="yes" media-type="text/html" doctype-system="about:legacy-compat"/>

  <xsl:variable name="localization" select="document('lang.xml')/settings/@lang"/>
  <xsl:variable name="resVar" select="document(concat('./p:localization/p:license.', normalize-space($localization), '.xml'))"/>

  <xsl:template match="/">
    <html>
      <head>
        <style type="text/css">
          p {text-indent:25px}
        </style>
      </head>
      <body>
        <h2>
          <xsl:value-of select="$resVar/resources/strings/string[@name='license']"/>
        </h2>
        <hr/>
        <xsl:choose>
          <xsl:when test="count(/p:license/p:positions/p:position) &gt; 0">

            <xsl:for-each select="/p:license/p:positions/p:position">
              <p>
                <xsl:value-of select="p:txt[@lang=$localization]"/>
              </p>
            </xsl:for-each>
          </xsl:when>
          <xsl:otherwise>
            <b>
              <xsl:value-of select="$resVar/resources/strings/string[@name='empty']"/>
            </b>
          </xsl:otherwise>
        </xsl:choose>
        <hr/>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Compositum
Дата 29.3.2012, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



не работает:
Цитата

Системная ошибка: -2146697211. 

а почему ты убрал атрибут, указывающий на нужный xsd-файл? Как по твоему он должен искать схему?
PM   Вверх
Compositum
Дата 29.3.2012, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



получилось. спасибо за помощь! Ты в коде сделал ошибку:
Код

<xsl:variable name="resVar" select="document(concat('./p:localization/p:license.', normalize-space($localization), '.xml'))"/>

Здесь не нужны префиксы "p", т.к. это путь к файлу, а не XML-дерево.

Рабочий вариант:
Код

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:p="http://www.pupkin.autocad.com/apps" exclude-result-prefixes="p">

  <xsl:output method="html" indent="yes" media-type="text/html" doctype-system="about:legacy-compat"/>
  <xsl:variable name="localization" select="document('lang.xml')/settings/@lang"/>
  <xsl:variable name="resVar" select="document(concat('./localization/license.', normalize-space($localization), '.xml'))"/>
  <xsl:template match="/">
    <html>
      <head>
        <style type="text/css">
          p {text-indent:25px}
        </style>
      </head>
      <body>
        <h2>
          <xsl:value-of select="$resVar/resources/strings/string[@name='license']"/>
        </h2>
        <hr/>
        <xsl:choose>
          <xsl:when test="count(/p:license/p:positions/p:position) &gt; 0">
            <xsl:for-each select="/p:license/p:positions/p:position">
              <p>
                <xsl:value-of select="p:txt[@lang=$localization]"/>
              </p>
            </xsl:for-each>
          </xsl:when>
          <xsl:otherwise>
            <b>
              <xsl:value-of select="$resVar/resources/strings/string[@name='empty']"/>
            </b>
          </xsl:otherwise>
        </xsl:choose>
        <hr/>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>


Я вот только не пойму, почему он работает несмотря на то, что ты не указал размещение XSD-файла...
В моём понимании файл должен быть таким:
Код

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:p="http://www.pupkin.autocad.com/apps" exclude-result-prefixes="p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.pupkin.autocad.com/apps license.xsd">

  <xsl:output method="html" indent="yes" media-type="text/html" doctype-system="about:legacy-compat"/>
  <xsl:variable name="localization" select="document('lang.xml')/settings/@lang"/>
  <xsl:variable name="resVar" select="document(concat('./localization/license.', normalize-space($localization), '.xml'))"/>
  <xsl:template match="/">
    <html>
      <head>
        <style type="text/css">
          p {text-indent:25px}
        </style>
      </head>
      <body>
        <h2>
          <xsl:value-of select="$resVar/resources/strings/string[@name='license']"/>
        </h2>
        <hr/>
        <xsl:choose>
          <xsl:when test="count(/p:license/p:positions/p:position) &gt; 0">
            <xsl:for-each select="/p:license/p:positions/p:position">
              <p>
                <xsl:value-of select="p:txt[@lang=$localization]"/>
              </p>
            </xsl:for-each>
          </xsl:when>
          <xsl:otherwise>
            <b>
              <xsl:value-of select="$resVar/resources/strings/string[@name='empty']"/>
            </b>
          </xsl:otherwise>
        </xsl:choose>
        <hr/>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

причём этот вариант так же работает...

п.с. Оба варианта работают даже если удалить XSD-файл. Т.е. получается, что обращения к XSD-файлу для проверки валидности контента не происходит???

Добавлено @ 12:31
Выкладываю работающий результат (см. прикреплённый файл). Правда меня смущает то, что, судя по всему, не происходит проверка на соответствие XSD-схеме, прежде чем отобразить содержимое в браузере...

Это сообщение отредактировал(а) Compositum - 29.3.2012, 12:32

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  sample.zip 3,99 Kb
PM   Вверх
Compositum
Дата 29.3.2012, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



правильно ли я понял, что браузеры не занимаются проверкой XML на валидность, несмотря на то, что в нём указана нужная XSD-схема? Или можно как-то указать, чтобы обязательно проверял, прежде чем выполнять отображение в соответствии с XSL?
PM   Вверх
diadiavova
Дата 29.3.2012, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Цитата(Compositum @  29.3.2012,  13:03 Найти цитируемый пост)
не работает:

У меня это выглядит так
user posted image

Цитата(Compositum @  29.3.2012,  13:03 Найти цитируемый пост)
а почему ты убрал атрибут, указывающий на нужный xsd-файл? Как по твоему он должен искать схему? 

Зачем преобразованию искать схему? smile 
Цитата(Compositum @  29.3.2012,  13:24 Найти цитируемый пост)
! Ты в коде сделал ошибку:

У меня как только получилось, так я и выложил, нотариально заверенный скриншот тому подтверждение smile 

Цитата(Compositum @  29.3.2012,  13:24 Найти цитируемый пост)
Я вот только не пойму, почему он работает несмотря на то, что ты не указал размещение XSD-файла...

Я это уже объяснил в предыдущих постах.
Цитата(Compositum @  29.3.2012,  13:24 Найти цитируемый пост)
причём этот вариант так же работает...

Ну не влияет схема на отображение smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Compositum
Дата 29.3.2012, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



странно, что у тебя отработало... у меня, пока я не убрал префиксы из пути к файлу, IE 8 выдавал указанную мною ошибку. А как насчёт моего последнего вопроса? smile

Это сообщение отредактировал(а) Compositum - 29.3.2012, 12:50
PM   Вверх
diadiavova
Дата 29.3.2012, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Цитата(Compositum @  29.3.2012,  13:50 Найти цитируемый пост)
IE 8

Я в лисе смотрел, но если это имя файла, то действительно странно. ИЕ9 просто выдает содержимое сплошняком.
Цитата(Compositum @  29.3.2012,  13:50 Найти цитируемый пост)
 А как насчёт моего последнего вопроса?

Я об этом уже писал
Цитата(diadiavova @  29.3.2012,  12:39 Найти цитируемый пост)
XSD на представление вообще не влияет, его может и не быть в принципе и это никак не отобразится на виде.  

И дело не в браузерах. Просто XSLT в принципе пофиг валидность, главное, чтобы документ был well-formed. Можешь выполнять преобразование программно, без помощи браузера и результат будет тем же. В XSLT2 вроде со схемой согласуется, тут была тема как-то, но совсем по другому поводу. В любом случае, сехма для преобразования не нужна и валидность ему тоже пофиг.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "XML/XSLT"
diadiavova

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

Также рекомендуем Вам зайти в раздел FAQ ,раздел дополняется и, возможно, там вы увидите готовое решение.

Для ответов на часто задаваемые вопросы существует FAQ раздела. Новости можно публиковать в разделе новостей. Для статей так же есть специальный раздел

Желаем удачи в Вашем деле!


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | XML, XSL | Следующая тема »


 




[ Время генерации скрипта: 0.0599 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.