2014-09-07 2 views
0

한 번에 여러 파일을 가져올 수없는 도구에서 가져와야하는 많은 XML 파일 컬렉션이 있습니다. 그래서 나는 그것들을 모두 하나의 최종 파일에 병합해야한다.XSLT를 사용하여 XML 파일 컬렉션 및 필터 데이터 병합

입력 파일 1 :

<?xml version="1.0" encoding="UTF-16LE"?> 
<!DOCTYPE tmx 
SYSTEM "tmx14.dtd"> 
<tmx version="1.4"> 
<header o-tmf="Euramis" creationtool="tm3" creationtoolversion="8.20 from 29-08-2011 15:47" segtype="sentence" datatype="PlainText" adminlang="EN-US" srclang="EN-GB"> 
</header> 
<body> 
<tu> 
<prop type="Txt::Doc. No.">22004D0069</prop> 
<tuv lang="EN-GB"> 
<seg>Text in English: blabla</seg> 
</tuv> 
<tuv lang="DE-DE"> 
<seg>Text in German: blabla</seg> 
</tuv> 
<tuv lang="ES-ES"> 
<seg>Text in Spanish: blabla</seg> 
</tuv> 
</tu> 
</body> 
</tmx> 

입력

이 세 가지 abrigded 샘플 파일 (세 가지를 모두 입력 파일 3 스페인의 텍스트를 제외하고는 동일하다) 내가 병합 할 필요가있다 2 파일 :

<?xml version="1.0" encoding="UTF-16LE"?> 
<!DOCTYPE tmx 
SYSTEM "tmx14.dtd"> 
<tmx version="1.4"> 
<header o-tmf="Euramis" creationtool="tm3" creationtoolversion="8.20 from 29-08-2011 15:47" segtype="sentence" datatype="PlainText" adminlang="EN-US" srclang="EN-GB"> 
</header> 
<body> 
<tu> 
<prop type="Txt::Doc. No.">22004D0070</prop> 
<tuv lang="EN-GB"> 
<seg>Text in English: blabla</seg> 
</tuv> 
<tuv lang="DE-DE"> 
<seg>Text in German: blabla</seg> 
</tuv> 
<tuv lang="ES-ES"> 
<seg>Text in Spanish: blabla</seg> 
</tuv> 
</tu> 
</body> 
</tmx> 

입력 파일을 3 :

<?xml version="1.0" encoding="UTF-16LE"?> 
<!DOCTYPE tmx 
SYSTEM "tmx14.dtd"> 
<tmx version="1.4"> 
<header o-tmf="Euramis" creationtool="tm3" creationtoolversion="8.20 from 29-08-2011 15:47" segtype="sentence" datatype="PlainText" adminlang="EN-US" srclang="EN-GB"> 
</header> 
<body> 
<tu> 
<prop type="Txt::Doc. No.">22004D0068</prop> 
<tuv lang="EN-GB"> 
<seg>Text in English: blabla</seg> 
</tuv> 
<tuv lang="DE-DE"> 
<seg>Text in German: blabla</seg> 
</tuv> 
<tuv lang="ES-ES"> 
<seg>Blablabla: a different text in Spanish</seg> 
</tuv> 
</tu> 
</body> 
</tmx> 

그리고 이것은 내가 달성하고자하는 것입니다 :

예상 출력 :

<?xml version="1.0" encoding="UTF-8"?> 
<tmx xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"> 
    <body> 
     <tu> 
     <prop type="Txt::Doc. No.">22004D0068</prop> 
     <tuv lang="EN-GB"> 
      <seg>Text in English: blabla</seg> 
     </tuv> 
     <tuv lang="ES-ES"> 
      <seg>Blablabla: a different text in Spanish</seg> 
     </tuv> 
     </tu> 
     <tu> 
     <prop type="Txt::Doc. No.">22004D0069</prop> 
     <tuv lang="EN-GB"> 
      <seg>Text in English: blabla</seg> 
     </tuv> 
     <tuv lang="ES-ES"> 
      <seg>Text in Spanish: blabla</seg> 
     </tuv> 
     </tu> 
    </body> 
</tmx> 

따라서, 변환이 의미 :

  • 을 제거하기 EN-GB 또는 ES-ES가 아닌 모든 언어
  • 두 개 이상의 tu 항목이 동일한 EN-GB tuv/seg 콘텐츠를 가진 경우 다른 ES-ES 콘텐츠가있는 tuv/seg 콘텐츠 만 유지하십시오. 그래서 tu 22004D0068과 tu 22004D0069는 보관해야하지만, tu 22004D0070은 (ES-ES는 22004D0069의 복제본이되어서는 안됩니다.)

나는 모든 파일을 병합 스타일 시트를 작성하는 관리했지만, 원하지 않는 TUV 항목 (예 : DE-DE)를 제거하지 않고 EN-GB와 ES-ES와 함께 전체 TU 항목을 필터링하지 않습니다 다른 tu에 이미있는 tuv/seg 콘텐츠.

이 내 스타일이다 :

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" 
    xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl" version="2.0"> 

    <xsl:output method="xml" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:variable name="collection"> 
     <xsl:copy-of select="collection('input_dir?strip-space=yes;select=*.tmx')/*"/> 
    </xsl:variable> 

    <xsl:variable name="tu" select="distinct-values($collection/tmx/body/tu/tuv)"/> 

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

    <xsl:template match="/"> 
     <tmx> 
      <body> 
       <xsl:for-each select="$tu"> 
        <xsl:apply-templates select="($collection/tmx/body/tu[tuv[@lang='EN-GB']=current()])"/> 
       </xsl:for-each> 
      </body> 
     </tmx> 
    </xsl:template> 
</xsl:stylesheet> 

그리고 이것은 무엇이다 :

<?xml version="1.0" encoding="UTF-8"?> 
<tmx xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"> 
    <body> 
     <tu> 
     <prop type="Txt::Doc. No.">22004D0068</prop> 
     <tuv lang="EN-GB"> 
      <seg>Text in English: blabla</seg> 
     </tuv> 
     <tuv lang="DE-DE"> <!-- German language should be left out --> 
      <seg>Text in German: blabla</seg> 
     </tuv> 
     <tuv lang="ES-ES"> 
      <seg>Blablabla: a different text in Spanish</seg> 
     </tuv> 
     </tu> 
     <tu> 
     <prop type="Txt::Doc. No.">22004D0069</prop> 
     <tuv lang="EN-GB"> 
      <seg>Text in English: blabla</seg> 
     </tuv> 
     <tuv lang="DE-DE"> <!-- German language should be left out --> 
      <seg>Text in German: blabla</seg> 
     </tuv> 
     <tuv lang="ES-ES"> 
      <seg>Text in Spanish: blabla</seg> 
     </tuv> 
     </tu> 
     <tu> <!-- this whole tu item should not be in my output --> 
     <prop type="Txt::Doc. No.">22004D0070</prop> 
     <tuv lang="EN-GB"> 
      <seg>Text in English: blabla</seg> 
     </tuv> 
     <tuv lang="DE-DE"> 
      <seg>Text in German: blabla</seg> 
     </tuv> 
     <tuv lang="ES-ES"> 
      <seg>Text in Spanish: blabla</seg> 
     </tuv> 
     </tu> 
    </body> 
</tmx> 

내가 통해 절반 방법을 생각 해요,하지만 난 붙어있어 약간의 도움이 필요합니다. 누군가 나에게 힌트를 주거나 올바른 방향으로 나를 가리킬 수 있습니까? XLST에 대한 기본적인 지식이 있습니다. 감사.

답변

0

XSLT 사고 방식은 익숙해 져 있습니다.

모든 고유 값을 먼저 찾았습니다. 괜찮습니다. 그런데이 선 고정되어야한다

<xsl:apply-templates select="($collection/tmx/body/tu[tuv[@lang='EN-GB']=current()])"/> 

라인은 상기 의 템플릿 (입력을 처리) 구별 값 중 하나를 갖는 모든 TU 요소를 적용한다. 하나의 고유 한 값당 하나의 tu 요소 만 처리하려고한다는 것을 이해합니다. 그러나 어느 것? 그게 그렇게 중요한 건가? 그곳에 다른 술어를 추가하여 첫 번째 시도를 시도 할 수 있습니다 : position()=1 또는 약자로 [1].

+0

고마워요, 미로. 이것은 도움이되지만 여전히 필요한 결과를 얻지 못합니다. 모든 요소 (또는 EN-GB 또는 ES-ES가 아닌 다른 잠재적 인 언어)를 제거해야합니다. 그리고 나는 "distinc value"에 대한 나의 명세에서 뭔가가 빠져 있다고 생각한다 :''뿐만 아니라'도 고려해야한다. 이 두 개의 'tuv'요소의 텍스트는 두 개의 'tu' 요소가 중복으로 간주되기 위해 동일해야합니다. – msoutopico

+0

''제거 - 템플릿 추가 :''또는 모든''tuv' 요소들''와 유지하고자하는 것들을위한 또 다른 템플릿을 포함합니다. ... 다른 언어 사이의 고유 한 값을 어떻게 고려해야할지 모르겠습니다. 'tuv' 엘리먼트에서 다른 값을 가진'tu' 엘리먼트를 선택 하시겠습니까? –

+0

고마워요, 미로! 나는 그럭저럭 쓸모없는 언어를 제거 할 수 있었다. 고유 값에 관해서는 'distinct-values ​​($ collection/tmx/body/tu [concat (tuv [@ lang ='EN-GB '],'++ ', tuv [ 선행 형제 : : tuv [@ lang = 'EN-GB'], 선행 형제 : tuv [@ lang = 'ES-ES']) ($ collection/tmx/body/tuv [@ lang = 'EN-GB']! = 선행 형제/tuv [@ lang = 'EN-GB']) tuv [@ lang = 'ES-ES']! = 선행 형제/tuv [@ lang = 'ES-ES']]/tuv)'하지만 고유 한'tu' . – msoutopico

관련 문제