source

상위 노드 없이 모든 하위 노드(요소, 주석, 텍스트)를 가져오는 XPath

ittop 2023. 10. 19. 22:44
반응형

상위 노드 없이 모든 하위 노드(요소, 주석, 텍스트)를 가져오는 XPath

상위 요소가 없는 모든 하위 노드(텍스트 요소, 주석 요소 및 하위 요소 포함)를 가져오려면 XPath가 필요합니다.도움이 필요한

샘플 예제:

<DOC>
<PRESENTEDIN>
    <X>
        First Text Node #1 
        <y> Y can Have Child Nodes # 
            <child> deep to it </child> 
         </y>
         Second Text Node #2 <z/> 
    </X>
    <EVTS>
        <evt/>
        <evt>
            <mtg_descr> SAE 2006 World Congress &amp; Exhibition </mtg_descr>
            <sess_descr> Advanced Hybrid Vehicle Powertrains (Part 1 of 5) </sess_descr>
            <loc> Detroit,MI,United States </loc>
            <sess_prod_grp_cd> TSESS </sess_prod_grp_cd>
            <sess_evt_name> P13 </sess_evt_name>
            <sess_gen_num> 138352 </sess_gen_num>
            <mtg_start_dt> 04/03/2006 </mtg_start_dt>
            <mtg_end_dt> 04/06/2006 </mtg_end_dt>
            <desig> CONGRESS-2006 </desig>
        </evt>
    </EVTS>
    <EVTTYPE>PAPER</EVTTYPE>
    <SUPERTECH>
        <![CDATA[C8585]]>
    </SUPERTECH>
</PRESENTEDIN>

XPATH 시도됨

   1. $doc/PRESENTEDIN/X
   2. $doc/PRESENTEDIN/X/descendant::*
   2. $doc/PRESENTEDIN/X/self::*

예상 출력

    First Text Node #1 
    <y> Y can Have Child Nodes # 
        <child> deep to it </child> 
     </y>
     Second Text Node #2 <z/> 

나는 원하지 않아

<X>
  First Text Node #1 
        <y> Y can Have Child Nodes # 
            <child> deep to it </child> 
         </y>
         Second Text Node #2 <z/> 
</X>

XPath(http://www.w3.org/TR/xpath/ #location- paths )의 설명서에서:

child::*컨텍스트 노드의 모든 요소 자식을 선택합니다.

child::text()컨텍스트 노드의 모든 텍스트 노드 자식을 선택합니다.

child::node()노드 유형에 상관없이 컨텍스트 노드의 모든 자식을 선택합니다.

그래서 당신의 대답은 다음과 같습니다.

$doc/PRESENTEDIN/X/child::node()

모든 중첩 노드의 평면 배열을 원하는 경우:

$doc/PRESENTEDIN/X/descendant::node()

다음 XPath 식을 사용합니다.

/*/*/X/node()

이것은 임의의 노드(요소, 텍스트 노드, 주석 또는 처리 명령) 중 임의의 하위 노드를 선택합니다.XXML 문서의 최상위 요소의 손자인 요소입니다.

선택한 노드를 정확하게 출력하는 XSLT 변환은 다음과 같습니다.

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes"/>
 <xsl:template match="/">
  <xsl:copy-of select="/*/*/X/node()"/>
 </xsl:template>
</xsl:stylesheet>

그리고 정확히 원하는 정확한 결과를 만들어냅니다.

   First Text Node #1            
    <y> Y can Have Child Nodes #                
        <child> deep to it </child>
    </y>            Second Text Node #2 
    <z />

설명:

  1. W3 XPath 1.0 스펙에 정의된 바와 같이,"child::node()노드 유형에 상관없이 컨텍스트 노드의 모든 자식을 선택합니다."이는 모든 요소, 텍스트 노드, 주석 노드 및 처리 명령 노드 자식이 이 노드 테스트에 의해 선택됨을 의미합니다.

  2. node()는 의 약어입니다.child::node()(왜냐하면)child::는 기본 축이며 축이 명시적으로 지정되지 않은 경우에 사용됩니다.

언급URL : https://stackoverflow.com/questions/5119655/xpath-to-get-all-child-nodes-elements-comments-and-text-without-parent

반응형