2014-05-21 3 views
3

XSLT 및 XPath를 처음 사용하여 두 파일을 병합하기 위해 스타일 시트를 작성하는 데 어려움을 겪고 있습니다.XSLT를 사용하여 XML 파일 병합 및 재구성

이 질문에 대해 저는 실제 데이터 대신 고민하고있는 개념의 간단한 예를 사용하려고합니다. 별도의 관련 데이터를 포함하는 두 개의 XML 파일이 있다고 가정 해 보겠습니다. authors.xmlbooks.xml. authors.xml에는 저자에 대한 몇 가지 기본 정보가 포함되어 있으며 books.xml에는 책에 대한 정보 (저자 포함, 중요한 내용)가 들어 있습니다.

작성자 컬렉션이 포함 된 결과 XML 파일을 원하지만 각 작성자 요소 내에 해당 저자에 속한 책 모음 도 필요합니다.

내가 지금까지 관리해온 가장 좋은 점은 각 저자의 책 목록을 복제하는 것인데 나는이 문제에 대해 완전히 이상하고 잘못된 접근법을 취할 수도 있다는 느낌을 가지고 있습니다. 나는 스타일 시트가 어떻게 처리되는지에 대해 머리 글자를 쓰기 시작했다.

샘플 authors.xml :

<authors> 
    <author> 
     <name>Jane Doe</name> 
     <age>25</age> 
    </author> 
    <author> 
     <name>John Smith</name> 
     <age>53</age> 
    </author> 
</authors> 

샘플 Books.xml을 :

<books> 
    <book> 
     <title>Flying Kites</title> 
     <author>Jane Doe</author> 
    </book> 
    <book> 
     <title>XSLT For Dummies</title> 
     <author>John Smith</author> 
    </book> 
    <book> 
     <title>Running Fast</title> 
     <author>Jane Doe</author> 
    </book> 
</books> 

샘플 output.xml : 나는 '

<authors> 
    <author> 
     <name>Jane Doe</name> 
     <age>25</age> 
     <books> 
      <book> 
       <title>Flying Kites</title> 
      </book> 
      <book> 
       <title>Running Fast</title> 
      </book> 
     </books> 
    </author> 
    <author> 
     <name>John Smith</name> 
     <age>53</age> 
     <books> 
      <book> 
       <title>XSLT For Dummies</title> 
      </book> 
     </books> 
    </author> 
</authors> 

나는 그것이 잘못된 궤도에있을 수 있습니다 두려워하지만 또한 내 현재 스타일을 제공 할 것이다 : 나는 주위 검색 몇 시간을 보냈어요

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output encoding="ISO-8859-1" indent="yes" method="xml"/> 
<xsl:variable name="books" select="document('books.xml')"/> 

<xsl:template match="/"> 
    <authors> 
     <xsl:apply-templates select="/authors/author"/> 
    </authors> 
</xsl:template> 

<xsl:template match="author"> 
    <author> 
     <name><xsl:value-of select="./name"/></name> 
     <age><xsl:value-of select="./age"/></age> 
     <books> 
      <xsl:apply-templates select="$books/books/book"/> 
     </books> 
    </author> 
</xsl:template> 

<xsl:template match="book"> 
    <!-- How to only copy if correct author? -->  
    <xsl:copy-of select="."/> 
</xsl:template> 

</xsl:stylesheet> 

하지만, 내가 찾은 아무것도 내 문제를 해결하지 않았다 -하지만, 내가 찾은 것은 XSLT와 XPath가 조금 더 잘 작동 하는지를 이해하는 데 도움이되었습니다.

질문이 here은 도움이되었지만, 주로 업데이트 된 데이터를 기존 파일에 'tacking'하는 것에 관한 것이 었습니다. 더 중요한 부분은 제공된 답변이 실제로하지 않은 날짜를 업데이트하는 것이 었습니다. 직접 수행 할 수 없었습니다.

나는 또한 /r/learnprogramming에 내 질문을 제기했지만, 내가 얻은 유일한 대답은 기본적으로 "XSLT는 끔찍합니다. 지금 도망하십시오."

나는 거의 도움을 요청하지 않지만 나는 어떤 접근법을 취해야하는지에 대한 생각조차없이 잠시 동안이 문제에 곤란을 겪었다. 어떤 도움이나 조언이라도 대단히 감사하겠습니다.

관련성이있는 경우 Saxon 9를 사용하여 xslt를 처리하고 있습니다.

답변

1

거의 다 왔어. 작성자 당 책을 선택하려면 author 템플리트에서 술어를 사용하십시오. (위 그림 참조)

<xsl:template match="author"> 
    <author> 
     <xsl:copy-of select="name"/> 
     <xsl:copy-of select="age"/> 
     <books> 
      <xsl:apply-templates select="$books/books/book[author=current()/name]"/> 
     </books> 
    </author> 
</xsl:template> 

당신은 대신 value-ofcopy-of 사용할 수 있습니다.당신은 전체 노드를 복사하려면

, 당신은 book 템플릿에 아무 것도 변경하지 않아도되지만 copy-of 또한 author 아이를 포함 할 것이다, 그래서 당신은 다르게 작업을 수행 할 수 있습니다 :

<xsl:template match="book"> 
    <xsl:copy> 
     <xsl:copy-of select="title"/> 
    </xsl:copy> 
</xsl:template> 
+0

오 와우. 내가 아주 가깝게 보인다. XSLT가 아니라 XPath에 대한 이해가 부족한 것 같습니다. 나는 이것을 나의 실제 데이터에 확실히 적용 할 수 있어야한다. 이것에 감사합니다! –

관련 문제