2015-05-29 51 views
2
<SRDBSW xmlns:xdb="http://xmlns.oracle.com/xdb" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Id="String" ShortIds="Y" > 
<OBJ_DF IdView="RW" ObjLevel="Element" Nature="" ObjectType="" ShortDescription="" ShortDescriptionCore="" LogicalShortDescription="" LongDescription="Reaction Wheel" LongDescriptionCore="" LogicalLongDescription="" Mnemonic="" IsDefined="Y" ModelType="" SerialNumber="" ProductTreeId="" CategoryFlag="7" OwnerFlag="7" InputVersion="" InputType="" InputReference="" > 
    <TC_STR_DF IdView="TCSTABCDE" IsDirect="Y" CategoryFlag="0" OwnerFlag="0" ShortDescription="TC Packet Header Structure" ShortDescriptionCore="TC Packet Header Structure" LongDescription="Item: TC Structure" Mnemonic="TC Structure" Type="TC_STR" > 
     <TC_STR_COMP_LIST> 
      <TC_STR_COMP CompOrder="3" ComponentType="Editable parameter" CompId="HABCA" EngValue="3" TakeValue="From occurrence" MonParRef="MBCDA" Mandatory="Yes" /> 
     </TC_STR_COMP_LIST> 
    </TC_STR_DF> 
</OBJ_DF> 

甲骨文XMLTABLE让孩子节点

我对XML的这一部分在Oracle表的XMLTABLE(这只是一个样品,我的XML是充满这些部分):

<SCOS_TM_DF IdView="1111" IsDirect="Y" CategoryFlag="0" OwnerFlag="0" ShortDescription="TC Packet Header Structure" ShortDescriptionCore="TC Packet Header Structure" LongDescription="Item: SCOS TM Packet" Mnemonic="SCOS TM Packet" Type="SCOS_TM" TpcfName="My TM packet" InterpretFlag="Both" DefOffsetTime="66" > 
     <TM_STR_COMP_LIST> 
      <TM_STR_COMP ComponentType="Single structure" CompId="TMSTABCDE" CompBytePos="0" CompBitPos="0" TimeOffset="0" SelectorParRef="MABCA" SelRawValue="0" /> 
     </TM_STR_COMP_LIST> 
    </SCOS_TM_DF> 

我需要找到所有的ComponentType="Single structure",但也需要得到“父亲”SCOS_TM_DF IdView="1111"

到目前为止,我正在此查询,但不能得到idview:

SELECT x.* 
FROM xmlimport t 
CROSS JOIN XMLTABLE ('/SRDBSW/OBJ_DF/TC_STR_DF/TC_STR_COMP_LIST/TC_STR_COMP/@*' 
      PASSING t.XMLDATA 
      COLUMNS 
      IdView VARCHAR2(30) PATH '/../../../@IdView', 
      CompId  VARCHAR2(30) PATH '@CompId', 
      attr_name  VARCHAR2(30) PATH 'local-name(.)', 
      attr_value  VARCHAR2(90) PATH '.') x 
      WHERE t.xmlkey = 'SRDB-XML-sample-1.xml'; 
+1

请查看关于使用Markdown格式化的[常见问题]。 –

回答

0

据我了解你想要做什么,IdView应包含的的@IdView属性<SCOS_TM_DF>祖先。

您正在使用从根节点(/../../../@IdView)开始的绝对路径,从您进一步上升的位置(到无法存在的根节点之上的元素)。你可能想要做的是从当前上下文.上升,例如。

IdView VARCHAR2(30) PATH './../../../@IdView' 

此外,您使用的是第三行XPath表达式不符合您的XML输入(其中是一个SCOS_TM_DF轴步?)。由于您没有提供完整的文档结构,因此很难在这里为您提供更多详细信息。

+0

他/这个部分的结构不工作是SRDBSW-> OBJ_DF-> TC_STR_DF-> TC_STR_COMP_LIST-> TM_STR_COMP ..不明白你的意思(哪里是SCOS_TM_DF轴的步骤?)。 –

+0

我将在顶部添加xml –

+0

有一个''元素,但是在查询中没有轴步骤遍历此元素。 XPath表达式与您的XML片段不匹配。我的第一部分评论没有得到你想表达的内容。 –

1

您也可以构建在XPath自己的元素,从而创建一个基于父节点上的属性:

SELECT x.* 
FROM xmlimport t 
CROSS JOIN XMLTABLE ('for $i in //*[@ComponentType = ''Single structure''] 
    return element {$i/name()} { attribute CompId {$i/@CompId}, 
     attribute IdView {$i/../../@IdView}, 
     $i }' 
    PASSING t.XMLDATA 
    COLUMNS IdView VARCHAR2(30) PATH '@IdView', 
    CompId VARCHAR2(30) PATH '@CompId', 
    attr_name VARCHAR2(30) PATH 'name(.)', 
    attr_value VARCHAR2(90) PATH '.' 
) x 
WHERE t.xmlkey = 'SRDB-XML-sample-1.xml'; 

我所做的节点名称通用的,所以这一切ComponentType="Single structure"匹配你的问题说你想要;这意味着它匹配示例XML片段。

我猜你想要什么attr_value是因为你的示例节点没有任何内容。

凭借扩展的片段:

<SRDBSW> 
    <OBJ_DF> 
    <SCOS_TM_DF IdView="1111" IsDirect="Y" CategoryFlag="0" OwnerFlag="0" ShortDescription="TC Packet Header Structure" ShortDescriptionCore="TC Packet Header Structure" LongDescription="Item: SCOS TM Packet" Mnemonic="SCOS TM Packet" Type="SCOS_TM" TpcfName="My TM packet" InterpretFlag="Both" DefOffsetTime="66" > 
     <TM_STR_COMP_LIST> 
     <TM_STR_COMP ComponentType="Single structure" CompId="TMSTABCDE" CompBytePos="0" CompBitPos="0" TimeOffset="0" SelectorParRef="MABCA" SelRawValue="0" /> 
     </TM_STR_COMP_LIST> 
    </SCOS_TM_DF> 
    <TC_STR_DF IdView="1112" IsDirect="Y" CategoryFlag="0" OwnerFlag="0" ShortDescription="TC Packet Header Structure" ShortDescriptionCore="TC Packet Header Structure" LongDescription="Item: SCOS TM Packet" Mnemonic="SCOS TM Packet" Type="SCOS_TM" TpcfName="My TM packet" InterpretFlag="Both" DefOffsetTime="66" > 
     <TC_STR_COMP_LIST> 
     <TC_STR_COMP ComponentType="Single structure" CompId="TCSTABCDE" CompBytePos="0" CompBitPos="0" TimeOffset="0" SelectorParRef="MABCA" SelRawValue="0">Test value</TC_STR_COMP> 
     </TC_STR_COMP_LIST> 
    </TC_STR_DF> 
    </OBJ_DF> 
</SRDBSW> 

那得到:

IDVIEW COMPID   ATTR_NAME   ATTR_VALUE  
-------- --------------- -------------------- --------------- 
1111  TMSTABCDE  TM_STR_COMP       
1112  TCSTABCDE  TC_STR_COMP   Test value  

SQL Fiddle demo

基于您的评论,你现在想的是,IdView来自该元素的名称,你可以抢在生成的元素的附加属性:

SELECT x.* 
FROM xmlimport t 
CROSS JOIN XMLTABLE (q'#for $i in //*[@ComponentType = 'Single structure'] 
    return element {$i/name()} {attribute IdView {$i/../../@IdView}, 
     attribute TopName {$i/../../name()}, 
     $i }#' 
    PASSING t.XMLDATA COLUMNS IdView VARCHAR2(30) PATH '@IdView', 
    TopName VARCHAR2(30) PATH '@TopName', 
    attr_name VARCHAR2(30) PATH 'name(.)', 
    attr_value VARCHAR2(90) PATH '.' 
) x 
WHERE t.xmlkey = 'SRDB-XML-sample-1.xml'; 

IDVIEW TOPNAME   ATTR_NAME   ATTR_VALUE  
-------- --------------- -------------------- --------------- 
1111  SCOS_TM_DF  TM_STR_COMP       
1112  TC_STR_DF  TC_STR_COMP   Test value  

我也转向使用alternative quote syntax,这意味着您不必逃避Single structure值附近的单引号。你只需要一个分隔符,它肯定不会出现在实际的字符串中,在这种情况下是XPath。我个人默认情况下通常使用方括号,但由于这些确实出现在属性匹配的XPath中,所以我使用#代替。

SQL Fiddle

+0

@AntónioRoque - 我不知道这意味着什么 - 它是好还是坏?你还没有在问题中说出你期望的输出(或者给出了完全符合你所说的条件的XML)。我已经添加了一个SQL小提琴链接到答案,显示我正在使用的数据和它的输出。 [您也可以使用原始片段运行此代码](http://sqlfiddle.com/#!4/4957a1/1)。 –

+0

忘记我的查询,不好。 –

+0

我只想“提取”我制作的[@ComponentType =''Single structure'']的元素的SCOS_TM_DF,“SCOS_TM_DF”标记/文本和“TC_STR_COMP”标记/文本的IDview值 –