2012-04-02 2 views
1

나는 pseudo-structure를 가진 비 heirarchal xml을 가지고있다. 모든 객체는 부모 ("루트"객체 제외)와 0 개 이상의 자식을 선언하지만 중첩 된 구조보다는 ID 및 참조 속성을 사용합니다. 이 중첩 된 구조로 변환하고 싶습니다. 기록을 위해 XSLT 1.0을 사용하여 구조적이지 않은 XML 파일에 구조를 추가하려면 어떻게해야합니까?

<document> 
    <object id="6" children="12,15"/> 
    <object id="12" parent="6" children="13,18"/> 
    <object id="13" parent="12" children="14,16,17"/> 
    <object id="14" parent="13"/> 
    <object id="15" parent="6" children="21,22"/> 
    <object id="16" parent="13"/> 
    <object id="17" parent="13"/> 
    <object id="18" parent="12" children="23,25"/> 
    <object id="19" parent="23"/> 
    <object id="21" parent="15"/> 
    <object id="22" parent="15"/> 
    <object id="23" parent="18" children="19,24"/> 
    <object id="24" parent="23"/> 
    <object id="25" parent="18"/> 
</document> 

은, 실제 문서는 또한 클래스와 비슷 객체가 속성에서 참조하는 개체 정의를 포함하지만 난 다시 참조 ID에 의해 정의에서 요소 이름을 검색해야합니다. 과정의 어느 시점에서 각 "객체"의 이름을 "템플릿"또는 "하위 섹션"으로 변환합니다. 사물을 단순화하면 구조를 적용한 후에이 작업을 수행 할 수 있습니다. 또한 XSLT 1.0을 사용하고 있기 때문에 children 속성에 토큰화된 "함수"가 있습니다.이 함수는 내장되어 있지 않습니다.

내가이 출력하고자 위에 그래서 예를 들어

:

<document> 
    <object id="6"> 
     <object id="12"> 
      <object id="13"> 
       <object id="14"/> 
       <object id="16"/> 
       <object id="17"/> 
      </object> 
      <object id="18"> 
       <object id="23"> 
        <object id="19"/> 
        <object id="24"/> 
       </object> 
       <object id="25"/> 
      </object> 
     </object> 
     <object id="15"> 
      <object id="21"/> 
      <object id="22"/> 
     </object> 
    </object> 
</document> 

이 객체 요소 다음은 예제를 단순화하기 위해 제거 된 등, 속성, 데이터를 다른 정보가 포함되어 있음을 명심하십시오, 그러나 문제에 복잡성의 층을 추가 할 수 있습니다.

가능한 경우 나는 이것을 우아하고 확장 가능한 방식으로하고 싶습니다. 나는 강요 당하지는 않지만 XSL 1.0 (기존 서버 소프트웨어와 통합 될 수 있도록)을 선호합니다.

나에게 도움이되거나 올바른 방향으로 나를 가르쳐 줄 수있는 사람에게 친절하게 감사드립니다!

+0

이 질문은 매우 모호합니다. 1). 완전한 XML 문서는 제공되지 않습니다 (최소한이지만 완전한 문서 만 필요합니다). 2). ''과''둘 다 존재합니다. 하나의 이름 만 생성 될 필요가 있거나, item '을 언제 생성 할 것인지를 결정합니다. 제발, 질문을 편집하고 누락 된 데이터/설명을 제공하십시오. –

+0

OK Dimitre, 정중하게 질문을 올렸습니다. 이제 내 질문은 당신이 도울 수 있느냐, 아니면 단순히 경찰을 치안했다는 것인가? – kcstrong

+0

kcstrong : 도움이되지 않는다면 왜 시간을 낭비하여 설명을 해줄까요? 나는 몇 분 안에 일하기 시작했습니다. 아마도 10 시간 후에 당신의 질문에 시간이있을 것입니다.나는이 솔루션을 게시하지 못하게하는 모호성에 도달하기 전에 나쁘지 않은 해결책을 가졌습니다. –

답변

0

전체 XSLT를 사용하지 않고 다음과 같이 변형을 구성 할 수 있습니다. 기본적으로 장부 템플릿은 장의 apply-templates를 호출하고 장의 템플릿은 토픽 등의 템플릿을 적용합니다. 키 여기에서는 부모로부터의 id를 변수에 넣고 있습니다. 그래서 자식을 찾기 위해 후속 apply-template 호출에서 사용할 수 있습니다.

<document> 
    <xsl:apply-templates select="/document/book" /> 
</document> 

<xsl:template match="/document/book"> 
    <xsl:variable name="bookid"> 
     <xsl:value-of select="@id"/> 
    </xsl:variable> 
    <xsl:element name="book"> 
     <xsl:attribute name="id"> 
     <xsl:value-of select="@id"/> 
     </xsl:attribute> 
     <xsl:apply-templates select="/document/chapter[@parent=$bookid]" /> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="/document/chapter"> 
    Template for chapter would be replicated from the book template above 
    . 
    . 
    . 
</xsl:template> 
+0

답변 해 주셔서 감사합니다. 이것이 유일한 방법 인 것처럼 보입니다. 나는 시도했지만 실패했으나, 엘리먼트를 명시 적으로 선언하지 않고도 n 번째 레벨로 요소를 재귀 적으로 중첩시킬 수있는 메소드의 조합이 여전히 존재하기를 바랬다. 누군가가 요소 이름 중 하나를 변경하고 동일한 시스템에서 유사한 문서를 처리하기 위해 코드를 재사용하도록 결정한 경우 코드를 변경하지 않아도됩니다. 건배! – kcstrong

+0

지금 당장 문제가 완전히 달라진 것 같아서 원래의 대답은 더 이상 의미가 없습니다. 소스 문서의 변경에 대해 걱정할 경우 스키마 게시를 고려해야한다고 조언합니다. 이렇게하면 변환을 실행하기 전에 스키마에 대해 유효성을 검사 할 수 있으며 입력 문서가 미리 정의 된 스키마를 충족하는 한 결과가 균일하게 유지 될 수 있습니다. 원본 문서가 충분히 변경되면 일반 솔루션조차도 손상 될 수 있습니다. – javram

0

이 완료 짧고 간단하게 변환 :

<document> 
    <object id="6" children="12,15"/> 
    <object id="12" parent="6" children="13,18"/> 
    <object id="13" parent="12" children="14,16,17"/> 
    <object id="14" parent="13"/> 
    <object id="15" parent="6" children="21,22"/> 
    <object id="16" parent="13"/> 
    <object id="17" parent="13"/> 
    <object id="18" parent="12" children="23,25"/> 
    <object id="19" parent="23"/> 
    <object id="21" parent="15"/> 
    <object id="22" parent="15"/> 
    <object id="23" parent="18" children="19,24"/> 
    <object id="24" parent="23"/> 
    <object id="25" parent="18"/> 
</document> 

가 원하는, 올바른 결과을 생산 : 제공된 XML 문서에 적용

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:key name="kChildren" match="object" use="@parent"/> 

<xsl:template match="/*"> 
    <document> 
    <xsl:apply-templates select="*[not(@parent)]"/> 
    </document> 
</xsl:template> 

<xsl:template match="object"> 
    <object id="{@id}"> 
    <xsl:apply-templates select="key('kChildren', @id)"/> 
    </object> 
</xsl:template> 
</xsl:stylesheet> 

:

<document> 
    <object id="6"> 
     <object id="12"> 
      <object id="13"> 
       <object id="14"/> 
       <object id="16"/> 
       <object id="17"/> 
      </object> 
      <object id="18"> 
       <object id="23"> 
        <object id="19"/> 
        <object id="24"/> 
       </object> 
       <object id="25"/> 
      </object> 
     </object> 
     <object id="15"> 
      <object id="21"/> 
      <object id="22"/> 
     </object> 
    </object> 
</document> 

설명 : 올바른 키 사용.

관련 문제