2016-07-12 2 views
1

에 같은 이름으로 변환 할 수있는 문서를 이동 노드를 변환 더 많거나 적은 같은 같습니다자신의 부모 노드

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <someCatalogProp>ąć</someCatalogProp> 
    <meanProp> 
      <node id="1"> 
    <someProperty>blabla1</someProperty> 
    <children> 
     <node idref="2"/> 
    </children> 
    </node> 
    <node id="2"> 
    <someProperty>blabla2</someProperty> 
    <children> 
     <node idref="3"/> 
    </children> 
    </node> 
    </meanProp> 
    <node id="1"> 
    <someProperty>blabla1</someProperty> 
    <children> 
     <node idref="2"/> 
    </children> 
    </node> 
    <node id="2"> 
    <someProperty>blabla2</someProperty> 
    <children> 
     <node idref="3"/> 
    </children> 
    </node> 
    <node id="3"> 
    <someProperty>blabla3</someProperty> 
    <children> 
    </children> 
    </node> 
</root> 

결과 문서는 다음과 같아야합니다

<root> 
<someCatalogProp>ąć</someCatalogProp> 
    <node id = "1"> 
     <someProperty>blabla1</someProperty> 
     <children> 
      <node id = "2"> 
       <someProperty>blabla2</someProperty> 
       <children> 
        <node id = "3"> 
         <someProperty>blabla2</someProperty> 
         <children> 
         </children> 
        </node> 
       </children> 
      </node> 
     </children> 
    </node> 
</root> 

수 아이들의 수는 배가 될 수 있습니다. 계층 구조의 깊이는 제한되지 않습니다.

변환 xslt는 어떻게 생겼을 까? 미리 감사드립니다.

+0

을 새 예를 다시 왜 출력에는'meanProp' 노드가 없다? 또한 동일한 id를 가진 여러 개의 node-element가 있습니다 - ** 매우 ** 문제가 있습니다. 그리고 출력물은 그것을 처리하는 방법을 제공하지 않습니다. –

답변

1

keys을 사용하면 실제로 매우 간단합니다.

XML

<root> 
    <node id="1"> 
     <someProperty>blabla1</someProperty> 
     <children> 
      <node idref="2"/> 
     </children> 
    </node> 
    <node id="2"> 
     <someProperty>blabla2</someProperty> 
     <children> 
      <node idref="3"/> 
     </children> 
    </node> 
    <node id="3"> 
     <someProperty>blabla2</someProperty> 
     <children> 
     </children> 
    </node> 
</root> 

다음 스타일 시트 적용 :

당신이 잘 형성 입력 등이 제공

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="child" match="node" use="@id" /> 
<xsl:key name="parent" match="node" use="@idref" /> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="/root"> 
    <xsl:copy> 
     <xsl:apply-templates select="node[not(key('parent', @id))]"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="node[@idref]"> 
    <xsl:apply-templates select="key('child', @idref)"/> 
</xsl:template> 

</xsl:stylesheet> 

가 생성됩니다

결과

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <node id="1"> 
     <someProperty>blabla1</someProperty> 
     <children> 
     <node id="2"> 
      <someProperty>blabla2</someProperty> 
      <children> 
       <node id="3"> 
        <someProperty>blabla2</someProperty> 
        <children/> 
       </node> 
      </children> 
     </node> 
     </children> 
    </node> 
</root> 
+0

예를 들어, 노드 ID = "1"위에 ab Greg

+0

과 같이 다른 태그가 루트 수준 바로 아래에있을 때 꽤 "임의의"결과를 얻습니다. 질문을 편집하고 * * 대표 ** (및 ** 잘 형성된 **) 입력 예. –

+0

건배! 실제 문서가 훨씬 큽니다. – Greg