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

Откуда:
Сообщений: 547
Если в запросе rpad(' ', ...) идет подряд разными колонками, то xmltype.transform в клоб рано или поздно, в зависимости, например, от кол-ва добавляемых пробелов, начент их сжирать.
Пример.
drop table test_x;
create table test_x (x clob, c clob);

declare
  xm  xmltype;
begin
  execute immediate 'truncate table test_x'; 
  
  select xmltype(cursor( 
                        select 
                          '1' f1,
                          rpad(' ', 25) f2,
                          rpad(' ', 25) f3,
                          rpad('4', 15) f4,
                          '5' f5
                        from dual
                        connect by level <= 145
                  )) 
  into xm
  from dual;  
  
  insert into test_x (x, c) 
  values (
xmltype.getclobval(xm), 
xmltype.transform(xm, xmltype(
'<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
 <xsl:output method="text"/>
 <xsl:template match="/">         
    <xsl:for-each select="ROWSET/*">
       <xsl:for-each select="*">
       <xsl:if test="not(position() = last())">
        <xsl:value-of select="concat(text(),'';'')"/>
      </xsl:if>
       <xsl:if test="position() = last()">
        <xsl:value-of select="concat(text(),''&#xA;'')"/>
      </xsl:if>
   </xsl:for-each>
</xsl:for-each>
 </xsl:template>
</xsl:stylesheet>')).getclobval() 
);
  -- commit;
end;   

Клоб test_x.C - на 141-й строке съедено поле запроса F3
Картинка с другого сайта.

При этом в самом XML - test_x.X - это поле с пробелами есть.
Эта проблема всплывает только у меня или у Вас тоже?
Как с этим бороться, не объеденяя два пробельных поля в одно (разробы отчетов могут быть не в теме за эти дела).
10 сен 14, 11:34    [16558177]     Ответить | Цитировать Сообщить модератору
 Re: xmltype.transform съедает пробелы, бага?  [new]
-2-
Member

Откуда:
Сообщений: 15330
MonteCarlos,

В стандарте XML witespaces и пробелы в частности не являются значимыми.
10 сен 14, 11:53    [16558335]     Ответить | Цитировать Сообщить модератору
 Re: xmltype.transform съедает пробелы, бага?  [new]
In_Wait
Member [заблокирован]

Откуда: When your words mean nothing, I go la la la
Сообщений: 20581
Воспроизводится
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production

Как боротся незнаю.
10 сен 14, 11:53    [16558345]     Ответить | Цитировать Сообщить модератору
 Re: xmltype.transform съедает пробелы, бага?  [new]
In_Wait
Member [заблокирован]

Откуда: When your words mean nothing, I go la la la
Сообщений: 20581
попробуй сначала трансформировать в хмл типа <a>1; ; ;4 ;5</a>
а потом уже когда он будет не xmltype почистить его от <a> и </a> .
10 сен 14, 12:00    [16558390]     Ответить | Цитировать Сообщить модератору
 Re: xmltype.transform съедает пробелы, бага?  [new]
Elic
Member

Откуда:
Сообщений: 29991
XMLType.extract: preserve or not preserve whitespaces?
10 сен 14, 12:07    [16558437]     Ответить | Цитировать Сообщить модератору
 Re: xmltype.transform съедает пробелы, бага?  [new]
MonteCarlos
Member

Откуда:
Сообщений: 547
Спасибо за советы, но
Elic
XMLType.extract: preserve or not preserve whitespaces?

У меня версия 11.2.0.3.0 - 64bit, PRESERVE по дефолту должен быть, если верить линку.

Явный прописон тоже проблему не решил.
...
<xsl:for-each select="*" xml:space="preserve">
...


In_Wait
попробуй сначала трансформировать в хмл типа <a>1; ; ;4 ;5</a>
а потом уже когда он будет не xmltype почистить его от <a> и </a> .

Типа так?
xmltype.transform(xm, xmltype(
  '<?xml version="1.0" encoding="utf-8"?>
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:output method="xml"/>
   <xsl:template match="/">
      <xsl:for-each select="ROWSET/*">
         <xsl:for-each select="*">
           <xsl:if test="position() = 1">
             <xsl:value-of select="concat(''&lt;a&gt;'', text(),'';'')" disable-output-escaping="yes"/>
           </xsl:if>         
           <xsl:if test="not((position() = last()) or (position() = 1))">
             <xsl:value-of select="concat(text(),'';'')"/>
           </xsl:if>
           <xsl:if test="position() = last()">
             <xsl:value-of select="concat(text(), ''&lt;a/&gt;'', ''&#xA;'')" disable-output-escaping="yes"/>
           </xsl:if>
     </xsl:for-each>
  </xsl:for-each>
   </xsl:template> 
  </xsl:stylesheet>')).getclobval() 
);

Не помогло. Кстати еще, количество полей и их названия в запросах на практике разные.
10 сен 14, 20:27    [16561465]     Ответить | Цитировать Сообщить модератору
 Re: xmltype.transform съедает пробелы, бага?  [new]
MonteCarlos
Member

Откуда:
Сообщений: 547
пробовал xmltransform вместо xmltype.transform, эфект тот же
10 сен 14, 20:32    [16561480]     Ответить | Цитировать Сообщить модератору
 Re: xmltype.transform съедает пробелы, бага?  [new]
In_Wait
Member [заблокирован]

Откуда: When your words mean nothing, I go la la la
Сообщений: 20581
перед трансформацией поставил

select xmltype(replace(xm.getclobval(), '<?xml version="1.0"?>', '')) into xm from dual;

вроде помогло
11 сен 14, 16:45    [16565002]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить