それはさまざまな方法で行うことができます。選択は、ソース データの構築方法、目的の出力形式などによって異なります。
1. XSLT 変換
関数を使用XMLTransform()
して属性を追加します。
SQLFiddle test
with params as (
select
XMLParse( content
'
<root>
<x a="a"/>
<x a="b"/>
<x a="c"/>
</root>
'
) as doc_field
from dual
)
select
XMLTransform(
doc_field,
XMLParse( content
'
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<root>
<xsl:for-each select="child::*">
<xsl:apply-templates></xsl:apply-templates>
</xsl:for-each>
</root>
</xsl:template>
<xsl:template match="x">
<x a="{@a}" b="{position()}" />
</xsl:template>
</xsl:stylesheet>
'
)
)
from params
2. 単一の XML を返す XQuery
関数 single XMLを使用XMLQuery()
すると、基本的に上記と同じ別のバリアントに変換できます。
SQLFiddle test
with params as (
select
XMLParse( content
'
<root>
<x a="a"/>
<x a="b"/>
<x a="c"/>
</root>
'
) as doc_field
from dual
)
select
XMLQuery(
'
<root>
{
for $x at $pos in $doc/root/x
return <x a="{$x/@a}" b="{$pos}" />
}
</root>
'
passing doc_field as "doc"
returning content
)
from params
3. 行の順序から値を取得する
この方法は、XML をオンザフライで構築する必要があり、構築フェーズでシーケンス属性値を挿入できる場合により適しています。
SQLFiddle test
with params as (
select 'a' a from dual union all
select 'b' a from dual union all
select 'c' a from dual
)
select
XMLElement("root",
XMLAgg(
XMLElement("x",
XMLAttributes(
a as "a",
rownum as "b"
)
)
)
)
from params
最後のメソッドは、関数を使用してレコードに分割する場合、既に作成された XML にも役立ちXMLTable()
ます。