2013-02-17 4 views
0

원본 XML 문서 을 원본 xml 문서로 변환하는 방법을 알고 싶습니다. 새로운 생성 된 XML의 요소에 일부 특성을 추가하고 싶습니다.xml 템플릿과 재귀를 사용하여 새 XML 문서를 만드는 방법은 무엇입니까?

내 원래 XML 파일은 다음과 같은 :

<shop> 
    <product> 
    <cookie ID="001"> 
    <price>2</price> 
    </cookie> 
    </product> 

    <product> 
    <bread ID="002"> 
    <price>5</price> 
    </bread> 
    </product> 

    <product> 
    <milk ID="003"> 
    <price>2</price> 
    </milk> 
    </product> 
</shop> 

나는 다음과 같은 XML이 변환하고 싶습니다 :

<newXML> 
    <newElement> 
    <newElement ID="001"> 
    <newElement price="2"/> 
    </newElement> 
    </newElement> 

    <newElement> 
    <newElement ID="002"> 
    <newElement price="5"/> 
    </newElement> 
    </newElement> 

    <newElement> 
    <newElement ID="003"> 
    <newElement price="2"/> 
    </newElement> 
    </newElement> 
</newXML> 

어떻게이 작업을 수행 할 수있는 좋은 방법이 될 것입니다? 템플릿으로 재귀를 사용하여 수행 할 수 있습니까? 아니면 더 좋은 방법이 있습니까? 나는 다음과 같은 논리를 사용하려고했습니다 : 현재 요소는 아이가있는 경우가 존재하는 경우

  1. 가 요소
  2. 판독 전류 요소의 ID를 생성하는 템플릿을 만들어 newElement에 넣어
  3. 이 적용 그것을 템플릿 (어떤 종류의 재귀)

많은 시도에도 불구하고 나는이 작업을 할 수 없었습니다. 귀하의 도움을 크게 극명하게 될 것입니다!

답변

2

이렇게하려면 XSLT의 매우 일반적인 디자인 패턴 인 XSLT ID 변환을 기반으로합니다. 있는 그대로 당신은 다음 요소에 맞게 추가 템플릿을 추가하고 이름을 변경하는 코드를 추가하거나 속성을 추가하면된다 무엇]

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

을 그냥 복사 요소를 템플릿을 가지고 당신과 함께 시작하고 정확하게하여 출력하려면 필요에 따라. 당신도 여기에 특정 요소 이름을 사용할 필요가 없습니다

<xsl:template match="shop"> 
    <newXML> 
    <xsl:apply-templates select="@*|node()"/> 
    </newXML> 
</xsl:template> 

: 예를 들어, 다음과 같은 템플릿을 추가 할 루트 요소의 이름을 변경합니다. 같은 이름에 ID 속성으로 이름을 변경하고 요소 싶었다 경우를 기반으로 속성을 작성하고자한다면, 당신은이

<xsl:template match="product/*[@ID]"> 
    <newElement> 
     <xsl:apply-templates select="@*|node()"/> 
    </newElement> 
</xsl:template> 

처럼 그리고 당신의 가격 요소의 경우 뭔가를 할 수 요소의 텍스트 내용에, 당신과 같이 템플릿을 추가 할 수 있습니다

<xsl:template match="price"> 
    <newElement price="{.}" /> 
</xsl:template> 

(참고,이 사용 속성 값 템플릿 여기에 속성을 만들려면이 보통 를 사용하는 것이 바람직하다. XSL :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:template match="shop"> <newXML> <xsl:apply-templates select="@*|node()"/> </newXML> </xsl:template> <xsl:template match="product"> <newElement> <xsl:apply-templates select="@*|node()"/> </newElement> </xsl:template> <xsl:template match="product/*[@ID]"> <newElement> <xsl:apply-templates select="@*|node()"/> </newElement> </xsl:template> <xsl:template match="price"> <newElement price="{.}" /> </xsl:template> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet> 

다음과 같은 출력 : 속성
)

것은 우선이 XML을 시도 당신은 단지 문서를 변환 할 같이

<newXML> 
    <newElement> 
     <newElement ID="001"> 
     <newElement price="2"/> 
     </newElement> 
    </newElement> 
    <newElement> 
     <newElement ID="002"> 
     <newElement price="5"/> 
     </newElement> 
    </newElement> 
    <newElement> 
     <newElement ID="003"> 
     <newElement price="2"/> 
     </newElement> 
    </newElement> 
</newXML> 
+1

이 매우 상세한 답변을 주셔서 너무 감사드립니다. 모두 내가 지금까지 테스트 한 exept 문제는 "product/* [@ ID]"와 관련이 있다고 생각합니다. 계속 오류가 발생합니다. 런타임 오류 : 파일 transform.xsl 줄 47 요소 복사 요소 노드에 자식 노드보다 먼저 요소 노드를 추가해야합니다. 어쨌든 당신의 대답은 매우 귀중했습니다. – Coltrane

0

사운드를, 왜 대신 XQuery를 시도하지 XSLT? 그것은 훨씬 간단합니다 ..

작성하려는 XML을 입력하고 {..}을 입력 파일에서 삽입하고 for $variable in //xpath을 입력하여 xpath 표현식과 일치하는 입력 파일 부분과 함께 반복하십시오.

그래서이 원하는 XML 파일을 생성합니다

<newXML>{ 
    for $prod in /shop/product/* return 
    <newElement> 
     <newElement>{ 
     $prod/@ID, 
     for $value in $prod/* return 
      <newElement price="{$value}"/> 
     }</newElement> 
    </newElement> 
}</newXML> 
관련 문제