Я использую DITA OT для преобразования XML в xhtml. Мой xsl выглядит как
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE some_name [
<!ENTITY nbsp " ">
]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:saxon="http://icl.com/saxon" extension-element-prefixes="saxon">
<xsl:import href="../map2xhtmtoc.xsl"/>
<!--<xsl:import href="result-doc.xsl"/>-->
<!--<xsl:import href="custom-ecollege-dita2xhtml.xsl"/>-->
<xsl:output name="html" method="html" indent="yes" encoding="UTF-8"/>
<!-- Define a newline character -->
<xsl:variable name="newline">
<xsl:text>
</xsl:text>
</xsl:variable>
<xsl:template match="/">
<html>
<head>
<body>
<xsl:apply-templates select="myProduct"/>
</body>
</head>
</html>
</xsl:template>
<!--other templates goes here-->
<div class="floatRight"/>
<div class="headerSeparator">
<xsl:text disable-output-escaping="yes">&nbsp;</xsl:text>
</div>
</xsl:template>
</xsl:stylesheet>
Теперь, если я попытался выполнить этот xsl против моего xml для преобразования xhtml, используя DITA OT jar cmd.
java -jar .libdost.jar /i:samples/mycompany/myContent/myContent.ditamap /transtype:xhtml /xsl:xsl/mycompany/custom-map2xhtml.xsl
После выполнения указанной выше команды я получаю следующую ошибку.
[xslt] D:DITA-OT1.5.2xslmycompanycustom-map2xhtm.xsl:21: Fatal Error! When 'standalone' or 'doctype-system' is specified, the document must be well-formed; but this document contains a top-level text node
[xslt] Failed to process null
Я ломаю себе голову, чтобы узнать, почему возникает эта ошибка.
Спасибо.
2 ответа
Лучший ответ
this document contains a top-level text node
Вы можете показать нам конец таблицы стилей XSLT? Есть ли текст после последнего </xsl:stylesheet>
? Это могло бы вызвать эту ошибку.
Обновить
Как заметил Димитр, начальный / конечный теги <xsl:template>
несбалансированы, поэтому, если вы не показываете только часть своего XSLT, это необходимо исправить.
Однако я согласен с @Tim C, что вам, вероятно, вообще не нужно объявление DOCTYPE в вашем XSLT. Вы не пытаетесь использовать объект
в таблице стилей, вы просто пытаетесь создать его. Поэтому, если вы удалите оператор DOCTYPE из таблицы стилей, вы ничего не потеряете.
Более того, в отличие от @Tim, DOCTYPE не должен объявлять объект nbsp
в выходном HTML, потому что он уже предопределен в HTML.
Наконец, я бы не согласился с @Tim на способ вывода неразрывного пробела в HTML. Отключить-вывод-экранирование — почти всегда неправильный подход, и он происходит из-за непонимания того, как работают синтаксический анализ и сериализация. Самый простой способ вывести неразрывный пробел в XSLT — напрямую использовать числовую сущность:
<div class="headerSeparator"> </div>
Это выведет неразрывный пробел.
«Но, — скажете вы, — я хочу, чтобы он выводил
!»
Это может случиться; когда output-method = «html», сериализация может использовать символьные сущности, встроенные в HTML, для выражения подобных символов. Или для сериализации можно использовать
или просто встроить неразрывный пробел напрямую. Все они являются законным HTML, и все они эквивалентны. Тогда возникает вопрос: почему вы хотите, чтобы он был сериализован как
, а не как какой-то другой эквивалент?
Если я неправильно понял, что вы пытаетесь сделать, поясните, где вы хотите разместить
и почему эта конкретная форма имеет значение.
3
LarsH
20 Окт 2011 в 01:10
Это может быть связано с объявлением DOCTYPE вверху страницы. Это также может быть текстовый узел верхнего уровня, на который указывает ошибка.
Вы хотите, чтобы DOCTYPE отображался в создаваемом HTML? Если это так, его, вероятно, следует удалить с того места, где он находится, и в вашем первом шаблоне выполните следующие действия:
<xsl:template match="/">
<xsl:text disable-output-escaping = "yes"><![CDATA[
<!DOCTYPE some_name [ <!ENTITY nbsp " "> ]>
]]>
</xsl:text>
Затем, когда XSLT преобразован, он выдаст следующий
<!DOCTYPE some_name [ <!ENTITY nbsp " "> ]>
<html>
0
Tim C
19 Окт 2011 в 15:32
У меня есть следующий xml:
<RootNode xmlns="http://someurl/path/path/path">
<Child1>
<GrandChild1>Value</GrandChild1>
<!-- Lots more elements in here-->
</Child1>
</RootNode>
У меня xslt следующий:
<xsl:stylesheet version="1.0" xmlns="http://someurl/path/path/path" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<NewRootNode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<NewChild1>
<xsl:for-each select="RootNode/Child1">
<NewNodeNameHere>
<xsl:value-of select="GrandChild1"/>
</NewNodeNameHere>
<!-- lots of value-of tags in here -->
</xsl:for-each>
</NewChild1>
</NewRootNode >
</xsl:template>
</xsl:stylesheet>
Проблема: это мой результат:
<?xml version="1.0" encoding="utf-8"?>
<NewRootNode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<NewChild1 />
</NewRootNode>
Я ожидаю увидеть:
<?xml version="1.0" encoding="utf-8"?>
<NewRootNode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<NewChild1>
<NewNodeNameHere>Value</NewNodeNameHere>
<!-- Other new elements with values from the xml file -->
</NewChild1>
</NewRootNode>
Мне не хватает информации внутри NewChild1, которая должна быть там.
Я думаю, что мой выбор для каждого правильный, поэтому единственное, о чем я могу думать, это проблема с пространством имен в Xml и пространством имен в xslt. Может ли кто-нибудь увидеть, что я делаю неправильно?
Всем привет.
Начал изучать xml и xsl. написал свой первый код, он не работает, почему? Вот фалй xml.xml:
XML | ||
|
Вот файл one.xsl:
XML | ||
|
Как Я понимаю при запуске xml файла в браузере одлжна формироваться html страничка. Но в ие появляется просто белый экран, а в опере выдает ошибку:
This document had an invalid XSLT stylesheet. Error message from the XSLT engine:
Error: missing required version attribute
Но Я пробывал указать версию, не помогает.
Скажите пожалуйста, где у меня ошибка?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
Firefox tells me «Error during XSLT transformation: XSLT transformation failed.» for an XML file that uses the following XSL file:
<?xml version='1.0' encoding='UTF-8'?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dxp='http://schemas.google.com/analytics/2009'
xmlns:gd='http://schemas.google.com/g/2005'
xmlns:fn='http://www.w3.org/2005/xpath-functions'>
<xsl:output method="html"/>
<xsl:template match="/">
<html><head><title>...</title></head><body>
<table frame='border' rules='all'>
<tr><th>site</th><th>week</th><th>pages</th><th>pageviews</th></tr>
<xsl:for-each select='feeds/feed/week'>
<xsl:for-each-group select='entry' group-by='fn:concat(
if (fn:matches(dxp:dimension[@name="ga:pagePath"]/@value, "^/sales"))
then "/sales"
else "non-/sales",
" referred from ",
if (fn:matches(dxp:dimension[@name="ga:referralPath"]/@value, "^/forsale"))
then "/forsale"
else "non-/forsale"
)'>
<tr>
<td><xsl:value-of select='../dxp:tableName'/></td>
<td>
<xsl:value-of select='../dxp:startDate'/>-<xsl:value-of select='../dxp:endDate'/>
</td>
<td><xsl:value-of select='current-grouping-key()'/></td>
<td><xsl:value-of select="sum(current-group()/dxp:metric/@value)"/></td>
</tr>
</xsl:for-each-group>
</xsl:for-each>
</table></body></html>
</xsl:template>
</xsl:stylesheet>
I can’t figure out what might be wrong with this. Anyone know?
(Obviously, if further info is needed from me in order that someone be able to answer this, I’ll be glad to provide that info: please comment asking for it. I don’t even know what kind of info might be helpful.)
EDIT: Someone mentioned in an answer that my including the XML file might help. It’s very long, but its general structure is:
<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet type='text/xsl' href='./foo.xsl'?>
<feeds xmlns:dxp='http://schemas.google.com/analytics/2009'
xmlns:gd='http://schemas.google.com/g/2005' >
<feed><week>
<id>http://www.google.com/analytics/feeds/data?ids=ga:bar&dimensions=ga:pagePath,ga:referralPath&metrics=ga:pageviews&filters=ga:medium%3D@referral&start-date=2011-12-11&end-date=2011-12-17</id>
<link rel='self' type='application/atom+xml' href='https://www.google.com/analytics/feeds/data?max-results=10&end-date=2011-12-17&start-date=2011-12-11&metrics=ga%3Apageviews&ids=ga%3Abar&dimensions=ga%3ApagePath%2Cga%3AreferralPath&filters=ga%3Amedium%3D%40referral'/>
<link rel='next' type='application/atom+xml' href='https://www.google.com/analytics/feeds/data?start-index=11&max-results=10&end-date=2011-12-17&start-date=2011-12-11&metrics=ga%3Apageviews&ids=ga%3Abar&dimensions=ga%3ApagePath%2Cga%3AreferralPath&filters=ga%3Amedium%3D%40referral'/>
<dxp:metric confidenceInterval='0.0' name='ga:pageviews' type='integer' value='9999'/>
<dxp:tableName>bar</dxp:tableName>
<dxp:endDate>2011-12-17</dxp:endDate>
<dxp:startDate>2011-12-11</dxp:startDate>
<entry gd:etag='W/"baz."' gd:kind='analytics#datarow'>
<dxp:dimension name='ga:pagePath' value='/'/>
<dxp:dimension name='ga:referralPath' value='/'/>
<dxp:metric confidenceInterval='0.0' name='ga:pageviews' type='integer' value='999'/>
</entry>
<entry gd:etag='W/"baz."' gd:kind='analytics#datarow'>
<dxp:dimension name='ga:pagePath' value='/'/>
<dxp:dimension name='ga:referralPath' value='/xyzzy1'/>
<dxp:metric confidenceInterval='0.0' name='ga:pageviews' type='integer' value='999'/>
</entry>
</week>
</feed>
<feed><week>
<id>http://www.google.com/analytics/feeds/data?ids=ga:bar2&dimensions=ga:pagePath,ga:referralPath&metrics=ga:pageviews&filters=ga:medium%3D@referral&start-date=2011-12-11&end-date=2011-12-17</id>
<link rel='self' type='application/atom+xml' href='https://www.google.com/analytics/feeds/data?max-results=10&end-date=2011-12-17&start-date=2011-12-11&metrics=ga%3Apageviews&ids=ga%3Abar2&dimensions=ga%3ApagePath%2Cga%3AreferralPath&filters=ga%3Amedium%3D%40referral'/>
<link rel='next' type='application/atom+xml' href='https://www.google.com/analytics/feeds/data?start-index=11&max-results=10&end-date=2011-12-17&start-date=2011-12-11&metrics=ga%3Apageviews&ids=ga%3Abar2&dimensions=ga%3ApagePath%2Cga%3AreferralPath&filters=ga%3Amedium%3D%40referral'/>
<dxp:metric confidenceInterval='0.0' name='ga:pageviews' type='integer' value='9999'/>
<dxp:tableName>bar2</dxp:tableName>
<dxp:endDate>2011-12-17</dxp:endDate>
<dxp:startDate>2011-12-11</dxp:startDate>
<entry gd:etag='W/"baz."' gd:kind='analytics#datarow'>
<dxp:dimension name='ga:pagePath' value='/'/>
<dxp:dimension name='ga:referralPath' value='/'/>
<dxp:metric confidenceInterval='0.0' name='ga:pageviews' type='integer' value='999'/>
</entry>
<entry gd:etag='W/"baz."' gd:kind='analytics#datarow'>
<dxp:dimension name='ga:pagePath' value='/'/>
<dxp:dimension name='ga:referralPath' value='/xyzzy2'/>
<dxp:metric confidenceInterval='0.0' name='ga:pageviews' type='integer' value='999'/>
</entry>
</week>
</feed>
</feeds>
Firefox tells me «Error during XSLT transformation: XSLT transformation failed.» for an XML file that uses the following XSL file:
<?xml version='1.0' encoding='UTF-8'?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dxp='http://schemas.google.com/analytics/2009'
xmlns:gd='http://schemas.google.com/g/2005'
xmlns:fn='http://www.w3.org/2005/xpath-functions'>
<xsl:output method="html"/>
<xsl:template match="/">
<html><head><title>...</title></head><body>
<table frame='border' rules='all'>
<tr><th>site</th><th>week</th><th>pages</th><th>pageviews</th></tr>
<xsl:for-each select='feeds/feed/week'>
<xsl:for-each-group select='entry' group-by='fn:concat(
if (fn:matches(dxp:dimension[@name="ga:pagePath"]/@value, "^/sales"))
then "/sales"
else "non-/sales",
" referred from ",
if (fn:matches(dxp:dimension[@name="ga:referralPath"]/@value, "^/forsale"))
then "/forsale"
else "non-/forsale"
)'>
<tr>
<td><xsl:value-of select='../dxp:tableName'/></td>
<td>
<xsl:value-of select='../dxp:startDate'/>-<xsl:value-of select='../dxp:endDate'/>
</td>
<td><xsl:value-of select='current-grouping-key()'/></td>
<td><xsl:value-of select="sum(current-group()/dxp:metric/@value)"/></td>
</tr>
</xsl:for-each-group>
</xsl:for-each>
</table></body></html>
</xsl:template>
</xsl:stylesheet>
I can’t figure out what might be wrong with this. Anyone know?
(Obviously, if further info is needed from me in order that someone be able to answer this, I’ll be glad to provide that info: please comment asking for it. I don’t even know what kind of info might be helpful.)
EDIT: Someone mentioned in an answer that my including the XML file might help. It’s very long, but its general structure is:
<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet type='text/xsl' href='./foo.xsl'?>
<feeds xmlns:dxp='http://schemas.google.com/analytics/2009'
xmlns:gd='http://schemas.google.com/g/2005' >
<feed><week>
<id>http://www.google.com/analytics/feeds/data?ids=ga:bar&dimensions=ga:pagePath,ga:referralPath&metrics=ga:pageviews&filters=ga:medium%3D@referral&start-date=2011-12-11&end-date=2011-12-17</id>
<link rel='self' type='application/atom+xml' href='https://www.google.com/analytics/feeds/data?max-results=10&end-date=2011-12-17&start-date=2011-12-11&metrics=ga%3Apageviews&ids=ga%3Abar&dimensions=ga%3ApagePath%2Cga%3AreferralPath&filters=ga%3Amedium%3D%40referral'/>
<link rel='next' type='application/atom+xml' href='https://www.google.com/analytics/feeds/data?start-index=11&max-results=10&end-date=2011-12-17&start-date=2011-12-11&metrics=ga%3Apageviews&ids=ga%3Abar&dimensions=ga%3ApagePath%2Cga%3AreferralPath&filters=ga%3Amedium%3D%40referral'/>
<dxp:metric confidenceInterval='0.0' name='ga:pageviews' type='integer' value='9999'/>
<dxp:tableName>bar</dxp:tableName>
<dxp:endDate>2011-12-17</dxp:endDate>
<dxp:startDate>2011-12-11</dxp:startDate>
<entry gd:etag='W/"baz."' gd:kind='analytics#datarow'>
<dxp:dimension name='ga:pagePath' value='/'/>
<dxp:dimension name='ga:referralPath' value='/'/>
<dxp:metric confidenceInterval='0.0' name='ga:pageviews' type='integer' value='999'/>
</entry>
<entry gd:etag='W/"baz."' gd:kind='analytics#datarow'>
<dxp:dimension name='ga:pagePath' value='/'/>
<dxp:dimension name='ga:referralPath' value='/xyzzy1'/>
<dxp:metric confidenceInterval='0.0' name='ga:pageviews' type='integer' value='999'/>
</entry>
</week>
</feed>
<feed><week>
<id>http://www.google.com/analytics/feeds/data?ids=ga:bar2&dimensions=ga:pagePath,ga:referralPath&metrics=ga:pageviews&filters=ga:medium%3D@referral&start-date=2011-12-11&end-date=2011-12-17</id>
<link rel='self' type='application/atom+xml' href='https://www.google.com/analytics/feeds/data?max-results=10&end-date=2011-12-17&start-date=2011-12-11&metrics=ga%3Apageviews&ids=ga%3Abar2&dimensions=ga%3ApagePath%2Cga%3AreferralPath&filters=ga%3Amedium%3D%40referral'/>
<link rel='next' type='application/atom+xml' href='https://www.google.com/analytics/feeds/data?start-index=11&max-results=10&end-date=2011-12-17&start-date=2011-12-11&metrics=ga%3Apageviews&ids=ga%3Abar2&dimensions=ga%3ApagePath%2Cga%3AreferralPath&filters=ga%3Amedium%3D%40referral'/>
<dxp:metric confidenceInterval='0.0' name='ga:pageviews' type='integer' value='9999'/>
<dxp:tableName>bar2</dxp:tableName>
<dxp:endDate>2011-12-17</dxp:endDate>
<dxp:startDate>2011-12-11</dxp:startDate>
<entry gd:etag='W/"baz."' gd:kind='analytics#datarow'>
<dxp:dimension name='ga:pagePath' value='/'/>
<dxp:dimension name='ga:referralPath' value='/'/>
<dxp:metric confidenceInterval='0.0' name='ga:pageviews' type='integer' value='999'/>
</entry>
<entry gd:etag='W/"baz."' gd:kind='analytics#datarow'>
<dxp:dimension name='ga:pagePath' value='/'/>
<dxp:dimension name='ga:referralPath' value='/xyzzy2'/>
<dxp:metric confidenceInterval='0.0' name='ga:pageviews' type='integer' value='999'/>
</entry>
</week>
</feed>
</feeds>
Форум программистов Vingrad
Новости ·
Фриланс ·
FAQ
Правила ·
Помощь ·
Рейтинг ·
Избранное ·
Поиск ·
Участники
Форум -> Технологии и алгоритмы -> XML, XSL
Модераторы: diadiavova |
Поиск: |
|
XSLT 2.0 Ошибка преобразования!!! Браузер выводит ошибку преобразования |
Опции темы |
zeusakm | |
Новичок Профиль Репутация: нет |
С xslt 1.0 работал все что выводил через Firefox запуская XML в котором цепляется таблица XSLT 1.0 версии работает все норм. Это сообщение отредактировал(а) zeusakm — 25.10.2008, 22:21 |
zeusakm | |||||
Новичок Профиль Репутация: нет |
Так же XSL код:
Наверняка для профи в xml/xslt, эта проблема — не проблема и решить ее можно легко. Это сообщение отредактировал(а) zeusakm — 25.10.2008, 23:43 |
||||
zeusakm | |
Новичок Профиль Репутация: нет |
Ппц 35 просмотров и ни одного ответа?! Видимо действительно для России XSLT 2.0 слишком новая технология. =)) |
JVM | |
Бывалый Профиль Репутация: 4 |
Ну конечно. Особенно если учесть, что для преобразования XML использовать Firefox — его же в России пишут. |
Правила форума «XML/XSLT» | |
Прежде чем опубликовать вопрос, попробуйте воспользоваться поиском — возможно тема уже поднималась. Также рекомендуем Вам зайти в раздел FAQ ,раздел дополняется и, возможно, там вы увидите готовое решение. Для ответов на часто задаваемые вопросы существует FAQ раздела. Новости можно публиковать в разделе новостей. Для статей так же есть специальный раздел Желаем удачи в Вашем деле! Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, diadiavova. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) |
0 Пользователей: |
« Предыдущая тема | XML, XSL | Следующая тема » |
Подписаться на тему |
Подписка на этот форум |
Скачать/Распечатать тему
[ Время генерации скрипта: 0.0927 ] [ Использовано запросов: 20 ] [ GZIP включён ]
Реклама на сайте
Информационное спонсорство
��������� ������ �������
��������� ������ �������
��� ������������� JavaScript ��� �������� ���������� XML � XSL � ������ � ���� ����� �����, ��� �������� �� ������� �������. � ���������� ������� � ������� �� �������, ������ ��������� �Error!� � ��������-��������� <DIV>
��������� HTML, �� ��� �� ����� ������������. ��� �������� �������������� ����������?�
� ��������� ������� � �������� ������ ������ �������, ������� ������ ��� <PLANET>
� planets.xml
�� ��� <PLANETS>
:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xml" href="planets.xsl"?>
<PLANETS>
�<PLANETS>
� <NAME>Mercury</NAME>
��<MASS UNITS="(Earth = 1)">.0553</MASS>
��<DAY UNITS="days">58.65</DAY>
��<RADIUS UNITS="miles">1516</RADIUS>
��<DENSITY UNITS="(Earth = 1)">.983</DENSITY>
��<DISTANCE UNITS="million miles">43.4</DISTANCE><!--B ���������-->
�</PLANET>
�.
�.
�.
� ��������� �������� validateOnParse
������� XMLDocument
� true
(�������� �� ��������� � false
, ��� �������� ���������� ��������), ������� ��������� MSXML ������� ��� ������ �������. ������ XMLDocument
�������� ������ parseError
, � ���� ��� �������� errorCode
�� ����� ����, ��� �������� ������� ������. ������ � ���� �� ������ ������� ��������� �Error!�, � ������������ ������ ��� ������ ����� ������� getError
, ������� ���������� ������ � ����������� � ����� � ������� ������.
� ����� ��������� ���� �������������� ���������� � ��������� �������� <url, line, linepos � reason ������� parseError ��� ����, ����� ���������� ��������� �������� ����, ������, ������� ������ � �� �������� (������� 10.1).�
������� 10.1. �������� �������������� XSLT � ����������� ������ �������
<HTML>
�<HEAD>
� <TITLE>XSLT Using JavaScript</TITLE>
�� <SCRIPT LANGUAGE="JavaScript">
��� function xslt() {
��� var XMLDocument = new ActiveXObject('MSXML2.DOMDocument.3.0');
�� �var XSLDocument = new ActiveXObject('MSXML2.DOMDocument.3.0');
�� �var HTMLtarget = document.all['targetDIV'];
��� XMLDocument.validateOnParse = true;
��� XMLDocument.load('planets.xml');
�� �if (XMLDocument.parseError.errorCode != 0) {
��� �HTMLtarget.innerHTML = getError(XMLDocument);
��� �return false;
��� }
��� XSLDocument.validateOnParse = true;
�� �XSLDocument.load('planets.xsl');
�� �if (XSLDocument.parseError.errorCode != 0) {
��� �HTMLtarget.innerHTML = getError(XSLDocument);
��� �return false;
��� }
��� HTMLtarget.innerHTML = XMLDocument.transformNode(XSLDocument);
�� �return true;
�� }
�� function getError(errorObject) {
��� var Error = new String;
��� Error = "Error. " + errorObject.parseError.url + "<BR>" +
��� �"Line: " + errorObject.parseError.line + "<BR>" +
���� "Character: " + errorObject.parseError.linepos + "<BR>" +
�� ��"Description: " + errorObject.parseError.reason;
�� �return Error;
�� }
� </SCRIPT>
�</HEAD>
�<BODY>
��<DIV>
��</DIV>
�</BODY>
</HTML>
��������� ����� ������� �� ���. 10.2, ��� �������� ��������� ������ ����, ����� ������ � �������� ������ ����������� MSXML. ���� �� ����������� ������������� �������������� XSLT � Internet Explorer, ����� ������������ ������������� ���� ��������� ��������� �������, ��������� �������� ������ ������� ������������� �����.
���. 10.2. ��������� ������ �������
���� ��� � �������������� ��� ������ ���������� MSXML ������ �������� �������, �� ����� � ��� ���������� ����������� ������ ������������. ��������, � ��������� ������� � ������������ XSLT � Internet Explorer ��� ���������� ������ ������ � HTML-������� �� ������� ������. ��� ����� � ���� ���������� � ��������� ����� ������ ������� ������.
Время на прочтение
5 мин
Количество просмотров 7.8K
В прошлой статье я описал как реализовать инклудинг и кеширование при обработке xsl-темплейтов на стороне клиента. Сегодня я раскажу с помощью каких инструментов можно проводить отладку xslt-преобразований на стороне клиента и о работе конструкции <xsl:value-of select=«xxx» disable-output-escaping=«yes»/> в firefox.
Отладка XSLT на клиенте
Во время обработки xsl-документов в браузере могут происходить различные ошибки:
1) сетевые ошибки — когда xml или xsl данные не были получены;
2) ошибки обработки шаблонов.
Сетевые ошибки
Для контроля сетевых ошибок можно использовать отладочные средства браузеров. Все отладочные средства firebug (firefox), dragonfly (opera) и devtools (chrome) могут показать какие ресурсы были загружены из сети непосредственно ассинхронным запросом. Например, если мы обрабатываем данные in_data.xml с помощью шаблона first.xsl, то загрузку этих данных мы сможем проконтролировать
— раздел «net» в firebug
— раздел «net» в dragonfly
— раздел «resources» в devtools.
Иначе дело обстоит если для успешной обработки нужно подгрузить дополнительный xsl-файл (инклуд). В этом случае firebug (firefox) не покажет, что что-то было загружено.
А интегрированные среды дебагинга dragonfly (opera) и devtools (chrome) покажут какие дополнительные xsl файлы были подгружены.
Ошибки обработки шаблонов
Если во время обработки шаблона произошла ошибка, то её можно отловить и вывести в удобном для вас виде. Мне удобно во время разработки скидывать такие сообщения в консоль firebug’а
jQuery('#id_div').transform(
{ xml:'res/1.xml',
xsl:'res/1.xsl',
success:function (){
jQuery('#id_info').html('готово');
},
error:function (xml_data, xsl_data, success, cur_obj, error){
console.log('xml: '+xml_data);
console.log('xsl: '+xsl_data);
console.log('success: '+success);
console.log('cur_obj:');console.log(cur_obj);
console.log('error:');console.log(error);
}
});* This source code was highlighted with Source Code Highlighter.
В этом случае вывод ошибки будет примерно таким:
Событие «error» будет вызвано в случае возникновения ошибки. В функцию события будет передано несколько параметров, основной из которых — error — собстенно описание ошибки.
disable-output-escaping=«yes» в firefox
Описание проблемы
В некоторых случаях в xml-данных могут приходить целые куски отформатированного html, в этих случаях эти куски нужно вставлять в конечный документ без изменений, то есть «как есть». Например это могут быть данные, содержащие результаты поиска, в которых искомое слово выделенно жирным («мы <b>искали</b> все возможные решения»). Сделать простую замену текста средствами xslt можно, но того не стоит (попробуйте как-нибудь на досуге заняться этим). Поэтому проще передавать уже отформатированный текст. Опытный программист придумает ещё массу примеров. Для вставки данных без экранирования в xslt есть специальный атрибут disable-output-escaping, который необходимо установить в «yes». Выглядит это так
<xsl:value-of select="xxx" disable-output-escaping="yes"/>* This source code was highlighted with Source Code Highlighter.
Но в firefox, начиная самой первой версией и заканчивая всей третьей веткой (в firefox 4 не тестировал), не полная реализация xsl-процессора. Их xsl-процессор, который индентифицирует себя как «Transformiix», не обрабатывает disable-output-escaping=«yes». Этой ошибке уже много лет https://bugzilla.mozilla.org/show_bug.cgi?id=98168 и недавно мы «отмечали» 9-летие этой баги. Там же по ссылке написаны оправдания команды firefox, которые можно свести к одному — там много работы, если хотите правьте сами.
Решение проблемы
Существует такое решение проблемы — использовать вместо конструкции <xsl:value-of select=«xxx» disable-output-escaping=«yes»/> вызов <xsl:copy-of select=«xxx»/>. Но в этом случае мы не можем передать в узле xxx данные в виде
<xxx>Резельтат поиска <![CDATA[<i>"первый"</i>]]></xxx>* This source code was highlighted with Source Code Highlighter.
а придётся передавать данные так
<xxx>Резельтат поиска <i>"первый"</i></xxx>* This source code was highlighted with Source Code Highlighter.
то есть это будет уже не совсем верный xml-файл. И тогда мы получаем проблему в остальных браузерах, где такое решение работать уже не будет.
Другое решение проблемы
Я решил использовать другой подход. Использовать специальный фикс, написанный на javascript.
1. Вместо привычного <xsl:value-of select="xxx" disable-output-escaping="yes"/>
в наших шаблонах придётся использовать вызов
<xsl:call-template name="inc_disable_output_escaping"><xsl:with-param name="param" select="xxx"/></xsl:call-template>* This source code was highlighted with Source Code Highlighter.
Где темплейт inc_disable_output_escaping выглядит так:
<xsl:template name="inc_disable_output_escaping">
<xsl:param name="param"></xsl:param>
<xsl:choose>
<xsl:when test="system-property('xsl:vendor')='Transformiix'">
<!-- костыль для firefox -->
<div style="display:none" class="fix_ff_disable_output_escaping"><xsl:value-of select="$param" disable-output-escaping="yes"/></div>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$param" disable-output-escaping="yes"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>* This source code was highlighted with Source Code Highlighter.
В этом темплейте по имени xsl-процессора (xsl:vendor) мы выведем данные стандартной конструкцией с disable-output-escaping=«yes», а в случае xsl-процессора от firefox’а данные вставим в невидимый контейнер так, как firefox эти данные может вставить, то есть в экранированном виде.
А потом, после успешного преобразования, и обновления DOM документа, мы перекодируем данные в этих контейнерах на правильные и вставим их на место этих контейнеров.
function fix_ff_disable_output_escaping() {
jQuery('div.fix_ff_disable_output_escaping').each(
function(i, obj){
var j_obj=jQuery(obj);
j_obj.replaceWith(Encoder.htmlDecode(j_obj.html()));
}
)
}* This source code was highlighted with Source Code Highlighter.
Для декодирования html-мнемоник используется функция htmlDecode js-библиотеки Encoder.
Пример работы данной техники и архив с решением можно взять тут ra-project.net/xsl_tests/test2.html
PS Не забывайте отправлять правильный content-type для xml/xsl документов. А именно «Content-type: text/xml».
macnux wrote:
> you can take alook at server info i made it in order to
see it
> actualy xsl is supported and every thing is good here
Yes, XSL is definitely supported. Your problem is that
allow_url_fopen
is turned off. This prevents the XSL Transformation server
behavior from
accessing the RSS feed. Unfortunately, there’s nothing you
can do about
this unless you can persuade your hosting company to turn
allow_url_fopen on. The good news is that your server uses
PHP 5.2.3,
which has the following separate directives and settings:
allow_url_fopen Off
allow_url_include Off
Hosting companies typically turn off allow_url_fopen to
prevent sites
from including material from other servers, which can be a
security
risk. In PHP 5.2, allow_url_fopen no longer allows files to
be included
directly into a script. The new directive allow_url_include
now controls
remote includes.
What you need to persuade your hosting company is to use
these settings:
allow_url_fopen On
allow_url_include Off
This would allow you to pass RSS feeds to the XSL
Transformation server
behavior, but prevent the security risk of including a remote
file
directly inside your script. However, it might be difficult
to persuade
a support person to alter the company’s policy, even though
this change
is designed to make PHP much safer to use.
If you can’t get the hosting company to change its policy,
submit a
feature request to Adobe, asking them to improve the server
behavior so
that it uses a socket connection or cURL.
http://www.adobe.com/cfusion/mmform/index.cfm?name=wishform
Socket or cURL connections get around the problem of
allow_url_fopen
being turned off, but they’re not supported by the XSL
Transformation
server behavior.
—
David Powers, Adobe Community Expert
Author, “Foundation PHP for Dreamweaver 8” (friends of ED)
Author, “PHP Solutions” (friends of ED)
http://foundationphp.com/
Подскажите, пожалуйста, как исправить в смете недочёты, указанные в протоколе проверки. При проверке сметы в формате GGE на сайте Главгосэкспертизы система выдаёт предупреждение: «Неверный шифр норматива накладных расходов и сметной прибыли»,
Вопрос:
Добрый день! Подскажите, пожалуйста, как исправить в смете недочёты, указанные в протоколе проверки. При проверке сметы в формате GGE на сайте Главгосэкспертизы система выдаёт предупреждение: «Неверный шифр норматива накладных расходов и сметной прибыли», полученное значение: «Приказ № 812/пр от 21.12.2020 Прил. п.40.2», а ожидаемое: «812/пр-040.2». Второе предупреждение звучит так: «В ФЕР не обнаружен норматив Transport (ФССЦпг-01-01-01-041)» (какой здесь может быть норматив, если это погрузка), и такое же предупреждение система пишет по материальным ресурсам, на которых нет норматива. И эти предупреждения по всем позициям сметы. Хотя в протоколе проверки схемы XSD – без ошибок, проверка преобразования XSLT – без ошибок. Заранее благодарна.
Ответ:
Результаты работы данного сервиса «носят сугубо информационный характер и не несут никаких юридический последствий» – это цитата с одного из совещаний Главгосэкспертизы с разработчиками сметных программы. С вопросами по результатам работы данного сервиса необходимо обращаться к его разработчикам.
Единственное, что требуется от программы «ГРАНД-Смета» – это чтобы файл соответствовал схеме (Протокол проверки схемы XSD). Не более того.
Теперь по поводу описанных вами ошибок:
«Неверный шифр норматива накладных расходов и сметной прибыли»: на сегодняшний день не существует нормативно-правовых актов, регламентирующих формат заполнения данного поля. То есть порядок его заполнения, строго говоря, абсолютно произвольный. Мы неоднократно обращались в ГГЭ с просьбой урегулировать этот вопрос на уровне нормативно-правового акта, но пока вопрос остаётся открытым.
«В ФЕР не обнаружен норматив Transport (ФССЦпг-01-01-01-041)»: в нормативной базе эта позиция есть. Почему её нет в базе того информационного ресурса – вопрос не к нам.
Я использую DITA OT для преобразования XML в xhtml. Мой xsl выглядит как
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE some_name [
<!ENTITY nbsp " ">
]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:saxon="http://icl.com/saxon" extension-element-prefixes="saxon">
<xsl:import href="../map2xhtmtoc.xsl"/>
<!--<xsl:import href="result-doc.xsl"/>-->
<!--<xsl:import href="custom-ecollege-dita2xhtml.xsl"/>-->
<xsl:output name="html" method="html" indent="yes" encoding="UTF-8"/>
<!-- Define a newline character -->
<xsl:variable name="newline">
<xsl:text>
</xsl:text>
</xsl:variable>
<xsl:template match="/">
<html>
<head>
<body>
<xsl:apply-templates select="myProduct"/>
</body>
</head>
</html>
</xsl:template>
<!--other templates goes here-->
<div class="floatRight"/>
<div class="headerSeparator">
<xsl:text disable-output-escaping="yes">&nbsp;</xsl:text>
</div>
</xsl:template>
</xsl:stylesheet>
Теперь, если я попытался выполнить этот xsl против моего xml для преобразования xhtml, используя DITA OT jar cmd.
java -jar .libdost.jar /i:samples/mycompany/myContent/myContent.ditamap /transtype:xhtml /xsl:xsl/mycompany/custom-map2xhtml.xsl
После выполнения указанной выше команды я получаю следующую ошибку.
[xslt] D:DITA-OT1.5.2xslmycompanycustom-map2xhtm.xsl:21: Fatal Error! When 'standalone' or 'doctype-system' is specified, the document must be well-formed; but this document contains a top-level text node
[xslt] Failed to process null
Я ломаю себе голову, чтобы узнать, почему возникает эта ошибка.
Спасибо.
2 ответа
Лучший ответ
this document contains a top-level text node
Вы можете показать нам конец таблицы стилей XSLT? Есть ли текст после последнего </xsl:stylesheet>
? Это могло бы вызвать эту ошибку.
Обновить
Как заметил Димитр, начальный / конечный теги <xsl:template>
несбалансированы, поэтому, если вы не показываете только часть своего XSLT, это необходимо исправить.
Однако я согласен с @Tim C, что вам, вероятно, вообще не нужно объявление DOCTYPE в вашем XSLT. Вы не пытаетесь использовать объект
в таблице стилей, вы просто пытаетесь создать его. Поэтому, если вы удалите оператор DOCTYPE из таблицы стилей, вы ничего не потеряете.
Более того, в отличие от @Tim, DOCTYPE не должен объявлять объект nbsp
в выходном HTML, потому что он уже предопределен в HTML.
Наконец, я бы не согласился с @Tim на способ вывода неразрывного пробела в HTML. Отключить-вывод-экранирование – почти всегда неправильный подход, и он происходит из-за непонимания того, как работают синтаксический анализ и сериализация. Самый простой способ вывести неразрывный пробел в XSLT – напрямую использовать числовую сущность:
<div class="headerSeparator"> </div>
Это выведет неразрывный пробел.
“Но, – скажете вы, – я хочу, чтобы он выводил
!”
Это может случиться; когда output-method = “html”, сериализация может использовать символьные сущности, встроенные в HTML, для выражения подобных символов. Или для сериализации можно использовать
или просто встроить неразрывный пробел напрямую. Все они являются законным HTML, и все они эквивалентны. Тогда возникает вопрос: почему вы хотите, чтобы он был сериализован как
, а не как какой-то другой эквивалент?
Если я неправильно понял, что вы пытаетесь сделать, поясните, где вы хотите разместить
и почему эта конкретная форма имеет значение.
3
LarsH
20 Окт 2011 в 01:10
Это может быть связано с объявлением DOCTYPE вверху страницы. Это также может быть текстовый узел верхнего уровня, на который указывает ошибка.
Вы хотите, чтобы DOCTYPE отображался в создаваемом HTML? Если это так, его, вероятно, следует удалить с того места, где он находится, и в вашем первом шаблоне выполните следующие действия:
<xsl:template match="/">
<xsl:text disable-output-escaping = "yes"><![CDATA[
<!DOCTYPE some_name [ <!ENTITY nbsp " "> ]>
]]>
</xsl:text>
Затем, когда XSLT преобразован, он выдаст следующий
<!DOCTYPE some_name [ <!ENTITY nbsp " "> ]>
<html>
0
Tim C
19 Окт 2011 в 15:32