2016-11-04 2 views
2

Я разбираю XML-документ для создания другого XML-документа.Имена XSL PI, начинающиеся с XML, зарезервированы

документа выглядит так:

<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="02_tranformation.xsl"?> 
<ROWSET> 
<ROW> 
    <SRC_TABLE>myTable</SRC_TABLE> 
    <SRC_COLUMN>myColumn</SRC_COLUMN> 
</ROW> 
</ROWSET> 

и 02_tranformation.xsl файл выглядит так:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:fn="http://www.w3.org/2005/xpath-functions"> 

<xsl:output method="text" indent="no" encoding="UTF-8"/> 

    <xsl:template match="/ROWSET"> 
    &lt;?xml version="1.0" encoding="UTF-8"?&gt; 
    &lt;!DOCTYPE POWERMART SYSTEM "powrmart.dtd"&gt; 
    </xsl:template> 
</xsl:stylesheet> 

Результат должен быть:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE POWERMART SYSTEM "powrmart.dtd"> 

Но результат

TEMPLATE_ERROR: TRANSFORMATION: ORA-31011: XML parsing failed 
ORA-19213: error occurred in XML processing at lines 1 
LPX-00209: PI names starting with XML are reserved 

Я ищу множество сайтов помощи, но я до сих пор даже не понимаю, что это значит. Я не знаю, важно ли это, но это работает в приложении Apex, которое считывает имена таблиц из базы данных (как выбор из ...), создает XML из этого результата, и я разбираю этот результат. Проблема в том, что этот код работает в проводнике, но не в этом приложении. Может ли кто-нибудь мне помочь? Большое спасибо J.

+0

Если ваш метод вывода является «текстом», зачем вам нужно объявление XML и/или объявление DOCTYPE? В любом случае результат, который вы утверждаете, не может быть воспроизведен с использованием только вашего кода. –

+2

Одной из возможных причин ошибки является пробел перед объявлением XML. Это будет скопировано в результирующий документ. Анализ XML-парсера «

+0

Причина в том, что сгенерированный текст будет сохранен в файл с окончанием, которое я выбираю. В реальности это будет текст, но с .xml он будет считан и использован как XML-файл. – juditth

ответ

1

Правильный способ создать документ с показанными деклараций:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" doctype-system="powrmart.dtd" /> 

<xsl:template match="/ROWSET"> 
    <POWERMART/> 
</xsl:template> 

</xsl:stylesheet> 
+0

Да, я это знаю, но внутреннее приложение в Apex имеет какие-то проблемы с этим :-(Вот почему я использую текст. – juditth

+0

Вы должны узнать, какой тип вывода требуется вашему целевому приложению - тогда спросите, как производить такой вывод. Использование литералов для симуляции деклараций XML/DOCTYPE не требуется. –

+0

Я пробовал, он работал, но возникает другая проблема, теперь я точно знаю, что я не могу сгенерировать XML, мне нужно генерировать вывод как ТЕКСТ. это: '' Файл dtd не находится в приложении apex, но мне это нужно здесь Да, другой может быть добавлен после создания этого файла, но это не будет только один файл, может быть больше того, что преследуют эти сгенерированные файлы. Это то, что мне нужно, чтобы генерировать вывод TEXT. для вас совет. – juditth

0

Один из способов получения разыскиваемого вывод - если вы действительно необходимо выход это как текст:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 

    <xsl:template match="/*"> 
    <xsl:value-of select= 
    "'&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#xA;'"/> 
    <xsl:value-of select="'&lt;!DOCTYPE POWERMART SYSTEM &quot;powrmart.dtd&quot;&gt;'"/> 
    </xsl:template> 
</xsl:stylesheet> 

При нанесении на любом документе XML (проигнорировано/не используемый), результат:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE POWERMART SYSTEM "powrmart.dtd"> 

Обратите внимание: однако, что один не нужно XSLT писать строковые литералы на выход - сделать это в C (или любой другой традиционной PL) приложения.

Можно вывести нужные две строки в качестве пролога XML-документа с надлежащим использованием объявления <xsl:output>.

Просто используйте:

<xsl:output doctype-system="powrmart.dtd" /> 

Вам не нужно указать метод, версия и кодирования атрибуты, поскольку значения по умолчанию генерируется для этих псевдо-атрибутов XML декларация - именно то, что вам нужно.

+0

Спасибо! Я попробую, похоже, ваш совет может работать. К сожалению, я не писал это внутреннее приложение, поэтому я понятия не имею, что здесь может работать, а что нет. Спасибо, J. – juditth

+0

У вас есть идея, что означает эта ошибка? Спасибо – juditth

+0

@MichaelKay объяснил это в комментарии к вашему вопросу. Текст, который вы сгенерировали, позже интерпретируется (посредством того, что вы вызываете) как XML. Объявление XML не может предшествовать пробелу. В вашем случае это так. Таким образом, XML Parser не распознает декларацию как таковую и решает, что это обычная инструкция обработки (PI). Но стандарт XML не рекомендует имена элементов, атрибутов или PI начинать со строки «xml» в любой капитализации. Итак, ошибка. –