使用Oracle 11g进行XSLT XML转换

时间:2015-01-13 16:37:03

标签: xslt

我使用Oracle 11g SQL通过使用oracle函数xmltransform传递ML到XSLT来粉碎存储在表的CLOB列中的XML。     转换后,我得到列格式的碎片数据     在父节点重复的任何地方,子元素不会在父节点中重复

SQL query for transforming
---------------------------
with xml_xsl as (select '<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="xml"/>
      <xsl:template match="/">
        <ROWSET>
          <xsl:apply-templates select="*">
            <xsl:with-param name="lvl" select="0"/>
          </xsl:apply-templates>
     </ROWSET>
    </xsl:template>
    <xsl:template match="*">
      <xsl:param name="id"/>
      <xsl:param name="pid"/>
      <xsl:param name="pxp"/>
      <xsl:param name="lvl"/>
      <xsl:param name="position"/>
      <xsl:variable name="id" select="substring(generate-id(.),2)"/>
      <xsl:variable name="name" select="local-name(.)"/>
      <xsl:variable name="xp" select="concat($pxp,''/'',$name)"/>
      <xsl:variable name="pos" select="count(preceding::*[name(.)=$name])"/>
      <ROW id="{$id}" pid="{$pid}" name="{$name}" xpath="{$xp}" level="{$lvl+1}" position="{$pos}" kind="element">
        <xsl:value-of select="text()"/>
      </ROW>
      <xsl:apply-templates select="*">
        <xsl:with-param name="id" select="$id"/>
        <xsl:with-param name="pid" select="$id"/>
        <xsl:with-param name="pxp" select="$xp"/>
        <xsl:with-param name="lvl" select="$lvl+1"/>
        <xsl:with-param name="position" select="$pos"/>
      </xsl:apply-templates>
    </xsl:template>
  </xsl:stylesheet>' as xsl,
'<x1:A xmlns:x1="http://www.w3.org/transform">
    <x2:B xmlns:x2="http://www.w3.org/transform">
        <C>99999</C>
        <C>2222</C>
    </x2:B>
    <E>8888</E>
    <D>
        <G1>Deep</G1>
    </D>
    <D>
        <G>Deep3</G>
    </D>
</x1:A>' as xml from dual)
select x.*
  from xml_xsl a
     , xmltable('/ROWSET/ROW'
         passing xmltransform(xmlparse(document a.xml), xmlparse(document a.xsl wellformed))
         columns id         number         path '@id'
               , p_id       number         path '@pid'
               , node_name  varchar2(30)   path '@name'
               , node_value varchar2(4000) path '.'
               , xpath      varchar2(4000) path '@xpath'
               , pos        number     path '@position'
       ) x;

Input XML:
----------
<A>
    <B>
        <C>99999</C>
    </B>
    <E>8888</E>
    <D>
        <G1>Deep</G1>
    </D>
    <D>
        <G>XYZ</G>
    </D>
</A>

Output
-------
id  Parentid  node  depth position value xpath
--  --------  ----- ----- -------- ----- ------
1   NULL      A     0     0        NULL  /A
2   1         B     1     0        NULL  /A/B
3   2         C     2     0        99999 /A/B/C
4   1         E     1     0        8888  /A/E
5   1         D     1     0        NULL  /A/D
6   5         G1    2     0        Deep  /A/D/G1
7   1         D     1     1        NULL  /A/D
**8   7         G     2     0        XYZ   /A/D/G**    Postion for node G showing 0 which should req. 1

由于节点G先前不存在于父D中但存在于第二父D中,因此该位置应为1而不是0。

我尝试过所有事情,但没有得到解决方案。

0 个答案:

没有答案