Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 DBMS_XSLPROCESSOR  [new]
MW
Member

Откуда: Москва
Сообщений: 490
Делаю трансформацию XML с применением XSL-шаблона с помощью DBMS_XSLPROCESSOR.PROCESSXSL. XSL-шаблон кое где содержит спецзнаки (кавычки, апострофы и т.п.), после обработки на их месте находится текстовое представление ( " , ' ).
Можно-ли как-то сказать парсеру чтобы он не делал замену?
29 авг 06, 17:45    [3068020]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_XSLPROCESSOR  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1033
BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.7.0 - Production
variable result varchar2
declare
  Xsl    constant clob := '<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="text"/>
  <xsl:template match="/*"><Hello>, Node named ''<xsl:value-of select="name()"/>'' is ''<xsl:value-of select="text()"/>''
  </xsl:template>
</xsl:stylesheet>';
    Parser       Xmlparser.Parser := Xmlparser.Newparser;
    Processor    Xslprocessor.Processor := Xslprocessor.Newprocessor;
    Ss           Xslprocessor.Stylesheet ;
begin
  Xmlparser.Parseclob(Parser, Xsl);
  Ss := Xslprocessor.Newstylesheet(Xmlparser.Getdocument(Parser)
                                                  ,null);
  Xmlparser.parseBuffer(Parser,'<hello>world</hello>');
  Xslprocessor.Processxsl(Processor, Ss, Xmlparser.getDocument(Parser), :result);
end;
/

PL/SQL procedure successfully completed
result
---------
<Hello>, Node named 'hello' is 'world'
  
А у нас в квартире газ, а у вас?(с)
Покажите плиз свой кусочек кода
29 авг 06, 18:10    [3068163]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_XSLPROCESSOR  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1033
Прошу прощения, форум трасформировал lt, gt,потому не ясно где они были и где их не стало.. а были они только в тексте XSL символы & Заменяю на &*
  Xsl    constant clob := '<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="text"/>
  <xsl:template match="/*">&*lt;Hello&*gt; Node named ''<xsl:value-of select="name()"/>'' is ''<xsl:value-of select="text()"/>''
  </xsl:template>
</xsl:stylesheet>';
29 авг 06, 18:22    [3068211]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_XSLPROCESSOR  [new]
MW
Member

Откуда: Москва
Сообщений: 490
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:variable  name="img_src">/oradb/htroot/pic</xsl:variable>

<xsl:template match="INFO">
<html>
	<head>
		<title>12341234</title>
	</head>
	<body>

		
   <xsl:for-each select="ATTR">
         <a style="cursor:hand;">
		 <xsl:attribute name="onclick"><xsl:value-of select="@proc"/>('<xsl:value-of select="@val"/>')</xsl:attribute>
		 <img border="0">
			 <xsl:attribute name="title"><xsl:value-of select="@name"/></xsl:attribute>
			<xsl:attribute name="src"><xsl:value-of select="$img_src"/>/<xsl:value-of select="@i_name"/></xsl:attribute>
		 </img>
         </a>
     </xsl:for-each>
		
	</body>
</html>

</xsl:template>


</xsl:stylesheet>
  xxx := 
    '<?xml version="1.0" encoding="UTF-8" ?>
    <INFO img_src="/oradb/htroot/pic">
       <ATTR name="But1" val="1" proc="getone" i_name="goto-active.gif"/>
       <ATTR name="But2" val="2" proc="getone" i_name="goto-push.gif"/>
     </INFO>' ;
Конкретно здесь
<xsl:attribute name="onclick"><xsl:value-of select="@proc"/>('<xsl:value-of select="@val"/>')</xsl:attribute>
надо получить в результате
<a style="cursor:hand;" onclick="getone('1')">
, а получаем
<a style="cursor:hand;" onclick="getone(&apos;1&apos;)">
xsl:output method="text" тоже пробовал
30 авг 06, 08:51    [3069360]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_XSLPROCESSOR  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1033
Не удается повторить симптоматику, у меня отрабатывает:
Oracle9i Enterprise Edition Release 9.2.0.7.0 - Production
variable result varchar2
declare
  Xsl    constant clob := '<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:variable  name="img_src">/oradb/htroot/pic</xsl:variable>
<xsl:template match="INFO">
<html>
	<head>
		<title>12341234</title>
	</head>
	<body>
   <xsl:for-each select="ATTR">
         <a style="cursor:hand;">
		 <xsl:attribute name="onclick"><xsl:value-of select="@proc"/>(''<xsl:value-of select="@val"/>'')</xsl:attribute>
		 <img border="0">
			 <xsl:attribute name="title"><xsl:value-of select="@name"/></xsl:attribute>
			<xsl:attribute name="src"><xsl:value-of select="$img_src"/>/<xsl:value-of select="@i_name"/></xsl:attribute>
		 </img>
         </a>
     </xsl:for-each>
	</body>
</html>
</xsl:template>
</xsl:stylesheet>';
    Parser       Xmlparser.Parser := Xmlparser.Newparser;
    Processor    Xslprocessor.Processor := Xslprocessor.Newprocessor;
    Ss           Xslprocessor.Stylesheet ;
begin
  Xmlparser.Parseclob(Parser, Xsl);
  Ss := Xslprocessor.Newstylesheet(Xmlparser.Getdocument(Parser)
                                                  ,null);
  Xmlparser.parseBuffer(Parser,'<?xml version="1.0" encoding="UTF-8" ?>
    <INFO img_src="/oradb/htroot/pic">
       <ATTR name="But1" val="1" proc="getone" i_name="goto-active.gif"/>
       <ATTR name="But2" val="2" proc="getone" i_name="goto-push.gif"/>
     </INFO>');
  Xslprocessor.Processxsl(Processor, Ss, Xmlparser.getDocument(Parser), :result);
end;
/

PL/SQL procedure successfully completed
result
---------
<html>
   <head>
      <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>12341234</title>
   </head>
   <body><a style="cursor:hand;" onclick="getone('1')"><img border="0" title="But1" src="/oradb/htroot/pic/goto-active.gif">
      </a><a style="cursor:hand;" onclick="getone('2')"><img border="0" title="But2" src="/oradb/htroot/pic/goto-push.gif">
      </a>
   </body>
</html>
30 авг 06, 10:24    [3069708]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_XSLPROCESSOR  [new]
MW
Member

Откуда: Москва
Сообщений: 490
Забавно... У меня 10.2.0.2 (64bit) Solaris 10.
Попробовал на 9.2.0.6 RH4EL та же история.
Или что-то делаю не так или смотрю не туда.
Если в PLSQL Developer смотреть результат в закладке XML то показывается правильно. Что же отдать браузеру? :)
30 авг 06, 10:39    [3069794]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_XSLPROCESSOR  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1033
Интересна деффки пляшут(с)
Чем отличается SYS.XMLPARSER от XDB.DBMS_XMLPARSER - ответить затрудняюс, но работают они по разнмому - факт, пробовал на трех инстансах
Символы '&' заменил на комбинацию '&*'
Попробую щас поиграцца, авось чонить наиграю :))
Oracle9i Enterprise Edition Release 9.2.0.7.0 - Production
variable result varchar2
declare
  Xsl    constant long := '<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:variable  name="img_src">/oradb/htroot/pic</xsl:variable>
<xsl:template match="INFO">
<html>
	<head>
		<title>12341234</title>
	</head>
	<body>
   <xsl:for-each select="ATTR">
         <a style="cursor:hand;">
		 <xsl:attribute name="onclick"><xsl:value-of select="@proc"/>(''<xsl:value-of select="@val"/>'')</xsl:attribute>
		 <img border="0">
			 <xsl:attribute name="title"><xsl:value-of select="@name"/></xsl:attribute>
			<xsl:attribute name="src"><xsl:value-of select="$img_src"/>/<xsl:value-of select="@i_name"/></xsl:attribute>
		 </img>
         </a>
     </xsl:for-each>
	</body>
</html>
</xsl:template>
</xsl:stylesheet>';
    Parser       Dbms_Xmlparser.Parser := Dbms_Xmlparser.Newparser;
    Processor    Dbms_Xslprocessor.Processor := Dbms_Xslprocessor.Newprocessor;
    Ss           Dbms_Xslprocessor.Stylesheet ;
begin
  Dbms_Xmlparser.parseBuffer(Parser, Xsl);
  Ss := Dbms_Xslprocessor.Newstylesheet(Dbms_Xmlparser.Getdocument(Parser)
                                                  ,null);
  Dbms_Xmlparser.parseBuffer(Parser,'<?xml version="1.0" encoding="UTF-8" ?>
    <INFO img_src="/oradb/htroot/pic">
       <ATTR name="But1" val="1" proc="getone" i_name="goto-active.gif"/>
       <ATTR name="But2" val="2" proc="getone" i_name="goto-push.gif"/>
     </INFO>');
  Dbms_Xslprocessor.Processxsl(Processor, Ss, Dbms_Xmlparser.getDocument(Parser), :result);
end;
/

PL/SQL procedure successfully completed
result
---------
<html>
  <head>
    <title>12341234</title>
  </head>
  <body>
    <a style="cursor:hand;" onclick="getone(&*apos;1&*apos;)">
      <img border="0" title="But1" src="/oradb/htroot/pic/goto-active.gif"/>
    </a>
    <a style="cursor:hand;" onclick="getone(&*apos;2&*apos;)">
      <img border="0" title="But2" src="/oradb/htroot/pic/goto-push.gif"/>
    </a>
  </body>
</html>
30 авг 06, 11:06    [3069954]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_XSLPROCESSOR  [new]
MW
Member

Откуда: Москва
Сообщений: 490
В рекомендациях по XSLT, в частности в главе 16.2 HTML Output Method (тэг <xsl:output method="html"/>), написано:
The html output method should not escape a & character occurring in an attribute value immediately followed 
by a { character (see Section B.7.1 of the HTML 4.0 Recommendation). For example, a start-tag written in the stylesheet as

<BODY bgcolor='&amp;{{randomrbg}};'>

should be output as

<BODY bgcolor='&{randomrbg};'>

Но как-то неправильно оно все работает у Oracle
30 авг 06, 11:32    [3070132]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_XSLPROCESSOR  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10054
Zloxa
Интересна деффки пляшут(с)
Чем отличается SYS.XMLPARSER от XDB.DBMS_XMLPARSER - ответить затрудняюс


You just got lucky by using DBMS_XMLPARSER and MW, I guess, is more lucky with деффки :


XDK For PL/SQL API Has Been Deprecated from 9.2 Database
----------------------------------------------------------------------------------
The XML Developer's Kit for PL/SQL API is no longer loaded into the database by
default, starting with database version 9.2.0.1.0.

The packages XMLDOM, XMLPARSER and XSLPROCESSOR have been replaced by the new
PL/SQL API for XMLTYPE packages DBMS_XMLDOM, DBMS_XMLPARSER and
DBMS_XSLPROCESSOR.


SY.
30 авг 06, 17:28    [3072892]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_XSLPROCESSOR  [new]
MW
Member

Откуда: Москва
Сообщений: 490
Это ничего не объясняет. Мой код построен на DBMS-пакетах.
30 авг 06, 18:04    [3073165]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_XSLPROCESSOR  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1033
MW
Это ничего не объясняет. Мой код построен на DBMS-пакетах.

Не знаю, возможно я заблуждаюсь, но я это объяснение интерпиетировал так... начиная с 9.2.0.1.0 оракл заменил (replace) движок XML, причем "старый" движок он положил сбоку, в папочку XDK корнегого каталога оракла, там же оставил инструкцию, как оный прикрутить. Очевидно, мой SYS.XMLPARCER - тот самый вокруг которого мы, некогда, с нашим DBA и с бубном водили хороводы(без деффок, правда, жаль) - на прежнем инстансе поднимали. Очевидно, он мигрировал на нынешний инстанс.

Я часто обращаюсь к этому пакету, когда, скажем от XMLType.Transform не могу добиться того функционала, который вычитываю у w3org
30 авг 06, 19:05    [3073446]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_XSLPROCESSOR  [new]
MW
Member

Откуда: Москва
Сообщений: 490
Однако баг...
5 сен 06, 09:11    [3092549]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить