我使用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。
我尝试过所有事情,但没有得到解决方案。