XSLT를 사용하여 플랫 XML 파일에서 계층 적 XML 파일을 만들려고하는데 최선의 방법이 무엇인지 모르겠습니다.
XML에는 처리 할 데이터 요소가 있으며 각 데이터 요소에는 "속성"및 "관계"가 있습니다. 속성-현재 데이터와 관련된 정보를 포함합니다. 관계-하위 요소 (개체) 및 상위 ID와 관련된 정보를 포함합니다.
요소에 대한 상위 ID가없는 경우 데이터는 레벨 1로 그룹화되어야하며 후속 하위 요소는 레벨 2로 그룹화되어야합니다. 아래에 제공된 예에는 4 레벨까지의 데이터와 관계가 포함되어 있습니다. 실제 xml에는 더 많은 수준이 포함되어 있습니다. for-each의 조합을 시도하고 기능을 선택했는데 두 단계까지만 얻을 수있었습니다. 완전한 레벨을 얻기 위해 xml을 변환하는 XSLT로 저를 도울 수 있다면 감사합니다. 미리 감사드립니다!
입력 XML :
<results>
<content>
<data>
<id>12345</id>
<properties>
<name>ABC</name>
<date>2020-07-18</date>
</properties>
<relations>
<object>
<data>
<id>67890</id>
</data>
</object>
</relations>
</data>
<data>
<id>67890</id>
<properties>
<name>XYZ</name>
<date>2020-07-18</date>
</properties>
<relations>
<object>
<data>
<id>22246</id>
</data>
</object>
<parent>
<data>
<id>12345</id>
</data>
</parent>
</relations>
</data>
<data>
<id>22246</id>
<properties>
<name>DEF</name>
<date>2020-07-18</date>
</properties>
<relations>
<object>
<data>
<id>68681</id>
</data>
</object>
<parent>
<data>
<id>67890</id>
</data>
</parent>
</relations>
</data>
<data>
<id>68681</id>
<properties>
<name>UVW</name>
<date>2020-07-18</date>
</properties>
<relations>
<parent>
<data>
<id>22246</id>
</data>
</parent>
</relations>
</data>
<content>
</results>
예상 출력 :
<results>
<content>
<Level>
<id>12345</id>
<properties>
<name>ABC</name>
<date>2020-07-18</date>
</properties>
<relations>
<object>
<data>
<id>67890</id>
</data>
</object>
</relations>
<Leve2>
<id>67890</id>
<properties>
<name>XYZ</name>
<date>2020-07-18</date>
</properties>
<relations>
<object>
<data>
<id>22246</id>
</data>
</object>
<parent>
<data>
<id>12345</id>
</data>
</parent>
</relations>
<Leve3>
<id>22246</id>
<properties>
<name>DEF</name>
<date>2020-07-18</date>
</properties>
<relations>
<object>
<data>
<id>68681</id>
</data>
</object>
<parent>
<data>
<id>67890</id>
</data>
</parent>
</relations>
<Leve4>
<id>68681</id>
<properties>
<name>UVW</name>
<date>2020-07-18</date>
</properties>
<relations>
<parent>
<data>
<id>22246</id>
</data>
</parent>
</relations>
</Leve4>
</Leve3>
</Leve2>
</Level>
<content>
</results>
계층:
<Level1>
Parent1
<Level2>
Child1
...
<Level3>
Child1a
...
<Level4>
Child1aa
...
</Level4>
</Level3>
</Level2>
<Level1>
<Level1>
Parent2
<Level2>
Child2
...
<Level3>
Child2a
...
<Level4>
Child2aa
...
</Level4>
</Level3>
</Level2>
<Level>
...
문제를 아주 명확하게 설명하지 않았습니다. X의 <parent>
요소가 Y의 참조를 포함하는 경우 출력 에서 X가 Y의 자식이되기를 원한다고 가정하고 있습니다 <id>
. (내가 옳은 것이 문제인 경우 데이터는 많은 문제와 관련이없고 이해를 방해하는 혼란스러운 것).
이 가정에서 먼저 주어진 상위 항목을 쉽게 찾을 수있는 키를 정의하십시오.
<xsl : key name = "parent-key"match = "content / data"use = "relations / parent / object / id"/>
그런 다음 하나의 레코드를 처리 할 때 key () 함수를 사용하여 하위 항목을 가져옵니다.
<xsl:template match="content/data">
<xsl:param name="level" select="1"/>
<xsl:element name="Level{$level}">
<xsl:copy-of select="."/>
<xsl:apply-templates select="key('parent-key', id)">
<xsl:with-param name="level" select="$level + 1"/>
</xsl:apply-templates>
</xsl:element>
</xsl:template>
그런 다음 가장 높은 수준의 요소에서 처리를 시작하십시오 (귀하의 예에서는 이것이 첫 번째 요소이며 항상 그런지 모르겠습니다)
<xsl:template match="/">
<results>
<content>
<xsl:apply-templates select="data[1]"/>
</content>
</results>
</xsl:template>
검증되지 않은.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다