2014-12-05 8 views
2

내 문제의 일부를 해결하는 이전 질문 몇 개를 찾았습니다 (herehere 참조).하지만 통합하는 데 문제가 있습니다. 변환하려는 XML 레코드 집합이 있습니다. . 탭으로 구분 된 형식으로하지만, 모든 XML 레코드의 모든 필드가, 일부는 필드의 여러 인스턴스를 포함하지XSLT를 사용하여 복잡한 XML to TSV

두 샘플 XML 기록을 :. 나는 적응하기 위해 노력했습니다

<?xml version="1.0" encoding="UTF-8" ?> 
<marc:collection xmlns:marc="http://www.loc.gov/MARC21/slim" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd"> 
    <marc:record> 
     <marc:leader>02179 am a 002893u  </marc:leader> 
     <marc:controlfield tag="001">12789</marc:controlfield> 
     <marc:controlfield tag="005">20120521</marc:controlfield> 
     <marc:controlfield tag="007">cuuuu---auuuu</marc:controlfield> 
     <marc:controlfield tag="008">120521s|||| xx  o  0 u ||| |</marc:controlfield> 
     <marc:datafield tag="020" ind1=" " ind2=" "> 
      <marc:subfield code="a">9789089640574</marc:subfield> 
     </marc:datafield> 
     <marc:datafield tag="100" ind1="1" ind2=" "> 
      <marc:subfield code="a">Rooij van ,Robert</marc:subfield> 
      <marc:subfield code="4">aut</marc:subfield> 
     </marc:datafield> 
     <marc:datafield tag="245" ind1="1" ind2=" "> 
      <marc:subfield code="a">New Perspectives on Games and Interaction</marc:subfield> 
     </marc:datafield> 
     <marc:datafield tag="260" ind1=" " ind2=" "> 
      <marc:subfield code="b">Amsterdam University Press</marc:subfield> 
      <marc:subfield code="c">2008</marc:subfield> 
     </marc:datafield> 
     <marc:datafield tag="300" ind1=" " ind2=" "> 
      <marc:subfield code="a">1 electronic resource (330 p.)</marc:subfield> 
     </marc:datafield> 
     <marc:datafield tag="520" ind1=" " ind2=" "> 
      <marc:subfield code="a">This volume is a collection of papers ...</marc:subfield> 
     </marc:datafield> 
     <marc:datafield tag="650" ind1=" " ind2="0"> 
      <marc:subfield code="a">Mathematics</marc:subfield> 
     </marc:datafield> 
     <marc:datafield tag="650" ind1=" " ind2="0"> 
      <marc:subfield code="a">Philosophy (General)</marc:subfield> 
     </marc:datafield> 
     <marc:datafield tag="650" ind1=" " ind2="0"> 
      <marc:subfield code="a">Economic theory. Demography</marc:subfield> 
     </marc:datafield> 
     <marc:datafield tag="653" ind1=" " ind2=" "> 
      <marc:subfield code="a">Economics</marc:subfield> 
     </marc:datafield> 
     <marc:datafield tag="653" ind1=" " ind2=" "> 
      <marc:subfield code="a">Philosophy</marc:subfield> 
     </marc:datafield> 
     <marc:datafield tag="653" ind1=" " ind2=" "> 
      <marc:subfield code="a">Mathematics</marc:subfield> 
     </marc:datafield> 
     <marc:datafield tag="653" ind1=" " ind2=" "> 
      <marc:subfield code="a">Economie</marc:subfield> 
     </marc:datafield> 
     <marc:datafield tag="653" ind1=" " ind2=" "> 
      <marc:subfield code="a">Filosofie</marc:subfield> 
     </marc:datafield> 
     <marc:datafield tag="653" ind1=" " ind2=" "> 
      <marc:subfield code="a">Wiskunde</marc:subfield> 
     </marc:datafield> 
     <marc:datafield tag="700" ind1="1" ind2=" "> 
      <marc:subfield code="a">Apt ,Krzysztof</marc:subfield> 
      <marc:subfield code="4">aut</marc:subfield> 
     </marc:datafield> 
     <marc:datafield tag="856" ind1="4" ind2="0"> 
      <marc:subfield code="u">http://www.doabooks.org/doab?func=fulltext&amp;rid=12789</marc:subfield> 
      <marc:subfield code="z">Description of rights in Directory of Open Access Books (DOAB): Attribution Non-commercial (CC by-nc)</marc:subfield> 
     </marc:datafield> 
     <marc:datafield tag="856" ind1="4" ind2="0"> 
      <marc:subfield code="u">http://www.oapen.org/download?type=document&amp;docid=340074</marc:subfield> 
     </marc:datafield> 
    </marc:record> 
    <marc:record> 
     <marc:leader>01452 am a 001933u  </marc:leader> 
     <marc:controlfield tag="001">15497</marc:controlfield> 
     <marc:controlfield tag="005">20140217</marc:controlfield> 
     <marc:controlfield tag="007">cuuuu---auuuu</marc:controlfield> 
     <marc:controlfield tag="008">140217s|||| xx  o  0 u ||| |</marc:controlfield> 
     <marc:datafield tag="020" ind1=" " ind2=" "> 
      <marc:subfield code="a">9788867050673</marc:subfield> 
     </marc:datafield> 
     <marc:datafield tag="100" ind1="1" ind2=" "> 
      <marc:subfield code="a">Emanuele Haus</marc:subfield> 
      <marc:subfield code="4">aut</marc:subfield> 
     </marc:datafield> 
     <marc:datafield tag="245" ind1="1" ind2=" "> 
      <marc:subfield code="a">Dynamics of an elastic satellite with internal friction.</marc:subfield> 
     </marc:datafield> 
     <marc:datafield tag="260" ind1=" " ind2=" "> 
      <marc:subfield code="b">Ledizioni - LediPublishing</marc:subfield> 
      <marc:subfield code="c">2013</marc:subfield> 
     </marc:datafield> 
     <marc:datafield tag="300" ind1=" " ind2=" "> 
      <marc:subfield code="a">1 electronic resource (p.)</marc:subfield> 
     </marc:datafield> 
     <marc:datafield tag="520" ind1=" " ind2=" "> 
      <marc:subfield code="a">n this thesis, we study the dynamics...</marc:subfield> 
     </marc:datafield> 
     <marc:datafield tag="546" ind1=" " ind2=" "> 
      <marc:subfield code="a">english</marc:subfield> 
     </marc:datafield> 
     <marc:datafield tag="650" ind1=" " ind2="0"> 
      <marc:subfield code="a">Mathematics</marc:subfield> 
     </marc:datafield> 
     <marc:datafield tag="856" ind1="4" ind2="0"> 
      <marc:subfield code="u">http://www.doabooks.org/doab?func=fulltext&amp;rid=15497</marc:subfield> 
      <marc:subfield code="z">Description of rights in Directory of Open Access Books (DOAB): Attribution Non-commercial Share Alike (CC by-nc-sa)</marc:subfield> 
     </marc:datafield> 
     <marc:datafield tag="856" ind1="4" ind2="0"> 
      <marc:subfield code="u">http://www.ledizioni.it/stag/wp-content/uploads/2014/02/tesi_haus.pdf</marc:subfield> 
     </marc:datafield> 
    </marc:record> 
</marc:collection> 

previous answer의 XSLT, 지금까지 약간의 운이 있음 :

I는, 헤더 @tag의 고유 값 뒤에 leader 구성 할 달성하기 위해 노력하고있어 출력
<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xpath-default-namespace="http://www.loc.gov/MARC21/slim"> 
    <xsl:output method="text"/> 
    <xsl:variable name="delimiter" select="'&#09;'"/> 

    <xsl:strip-space elements="*"/> 
    <xsl:output method="text"/> 

    <xsl:key name="field" 
     match="/collection/record/datafield/subfield" 
     use="concat(../@tag,@code)"/> 

    <!-- variable containing the first occurrence of each field --> 
    <xsl:variable name="allFields" 
     select="/collection/record/datafield/subfield 
       [generate-id() 
       =generate-id(key('field', 
            concat(../@tag,@code))[1])]" /> 

    <xsl:template match="/"> 

     <xsl:for-each select="$allFields"> 
      <xsl:sort select="substring(concat(../@tag,@code),1,3)" 
         data-type="number"/> 
      <xsl:value-of select="concat(../@tag,@code)" /> 
      <xsl:if test="position() &lt; last()"> 
       <xsl:value-of select="$delimiter" /> 
      </xsl:if> 
     </xsl:for-each> 
     <xsl:text>&#10;</xsl:text> 
     <xsl:apply-templates select="*/*" /> 
    </xsl:template> 

    <xsl:template match="*"> 
     <xsl:variable name="this" select="." /> 

     <xsl:for-each select="$allFields"> 
      <xsl:sort 
       select="substring(concat(../@tag,@code),1,3)" 
       data-type="number"/> 
      <xsl:value-of 
       select="$this/*[@code = current()/@code]" /> 
      <xsl:if test="position() &lt; last()"> 
       <xsl:value-of select="$delimiter" /> 
      </xsl:if> 
     </xsl:for-each> 
     <xsl:text>&#10;</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 

10 tag 의해 오름차순으로 정렬 (서브 용 subfield/@code와 연결)

leader 001 005 007 008 020a 100a 1004 245a 260b 260c 300a 520a 546a 650a 653a 700a 7004 856u 856z 
레코드가 하나의 field/subfield 조합에 대한 여러 값이있는 경우

, 내가 예를 들어, 그들을 함께 concantenate 할 :

653a 
Economics|Philosophy|Mathematics 

그러나 레코드에 특정 필드가 누락되어 있으면 모든 것을 정렬 상태로 유지하기 위해 탭 문자 만 출력하고 싶습니다.

전체 샘플 TSV 출력 : -이에서 당신이 내보낼 필드 목록이 있어야 추론

leader 001 005 007 008 020a 100a 1004 245a 260b 260c 300a 520a 546a 650a 653a 700a 7004 856u 856z           
02179 am a 002893u   12789 20120521 cuuuu---auuuu 120521s|||| xx  o  0 u ||| | 9789089640574 Rooij van ,Robert aut New Perspectives on Games and Interaction Amsterdam University Press 2008 1 electronic resource (330 p.) This volume is a collection of papers  Mathematics|Philosophy (General)|Economic theory. Demography Economics|Philosophy|Mathematics|Economie|Filosofie|Wiskunde Apt ,Krzysztof< aut http://www.doabooks.org/doab?func=fulltext&amp;rid=12789|http://www.oapen.org/download?type=document&amp;docid=340074 Description of rights in Directory of Open Access Books (DOAB): Attribution Non-commercial (CC by-nc)          
01452 am a 001933u   15497 20140217 cuuuu---auuuu 140217s|||| xx  o  0 u ||| | 9788867050673 Emanuele Haus aut Dynamics of an elastic satellite with internal friction. Ledizioni - LediPublishing 2013 1 electronic resource (p.) In this thesis, we study the dynamics of an elastic body english Mathematics    http://www.doabooks.org/doab?func=fulltext&amp;rid=15497|http://www.ledizioni.it/stag/wp-content/uploads/2014/02/tesi_haus.pdf Description of rights in Directory of Open Access Books (DOAB): Attribution Non-commercial Share Alike (CC by-nc-sa)           
+0

당신이 정확한 전체 출력을 게시 할 수 있을까요? –

답변

2

나는 당신이이 방법을 시도 제안 XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:marc="http://www.loc.gov/MARC21/slim" 
exclude-result-prefixes="marc"> 
<xsl:output method="text" encoding="UTF-8"/> 

<xsl:variable name="fields"> 
    <xsl:for-each-group select="/marc:collection/marc:record/marc:datafield" group-by="@tag"> 
     <xsl:sort select="@tag"/> 
      <xsl:for-each select="marc:subfield"> 
       <xsl:sort/> 
       <field tag="{current-grouping-key()}" code="{@code}">a</field> 
      </xsl:for-each> 
    </xsl:for-each-group> 
</xsl:variable> 

<xsl:template match="/"> 
    <!-- header --> 
    <xsl:for-each select="$fields/field"> 
     <xsl:value-of select="@tag"/> 
     <xsl:value-of select="@code"/> 
     <xsl:if test="position()!=last()"> 
      <xsl:text>&#9;</xsl:text> 
     </xsl:if> 
    </xsl:for-each> 
    <xsl:text>&#10;</xsl:text> 
    <!-- data --> 
    <xsl:for-each select="marc:collection/marc:record"> 
     <xsl:variable name="current-record" select="." /> 
     <xsl:for-each select="$fields/field"> 
      <xsl:value-of select="$current-record/marc:datafield[@tag=current()/@tag]/marc:subfield[@code=current()/@code]" separator="|"/> 
      <xsl:if test="position()!=last()"> 
       <xsl:text>&#9;</xsl:text> 
      </xsl:if> 
     </xsl:for-each> 
     <xsl:if test="position()!=last()"> 
      <xsl:text>&#10;</xsl:text> 
     </xsl:if> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

결과 귀하의 예제 입력에 적용 :

020a 100a 1004 245a 260c 260b 300a 520a 546a 650a 653a 700a 7004 856z 856u 
9789089640574 Rooij van ,Robert aut New Perspectives on Games and Interaction 2008 Amsterdam University Press 1 electronic resource (330 p.) This volume is a collection of papers ...  Mathematics|Philosophy (General)|Economic theory. Demography Economics|Philosophy|Mathematics|Economie|Filosofie|Wiskunde Apt ,Krzysztof aut Description of rights in Directory of Open Access Books (DOAB): Attribution Non-commercial (CC by-nc) http://www.doabooks.org/doab?func=fulltext&rid=12789|http://www.oapen.org/download?type=document&docid=340074 
9788867050673 Emanuele Haus aut Dynamics of an elastic satellite with internal friction. 2013 Ledizioni - LediPublishing 1 electronic resource (p.) n this thesis, we study the dynamics... english Mathematics    Description of rights in Directory of Open Access Books (DOAB): Attribution Non-commercial Share Alike (CC by-nc-sa) http://www.doabooks.org/doab?func=fulltext&rid=15497|http://www.ledizioni.it/stag/wp-content/uploads/2014/02/tesi_haus.pdf 

: 내가 입력 또는 출력 중 하나에서 "리더"의 역할을 이해할 수 없었다.

2

당신은 "레코드가 특정 필드를 누락 된 경우"라고합니다. (MARC 전체? 이론적으로 가능한 모든 필드를 000에서 999까지만 말할 수 있으며 말할 필요도 없습니다.) 내보낼 필드 목록이 없다면 문제 문은 자동으로 실행됩니다. 모순되며 문제를 더 잘 이해해야합니다.

예를 들어 변수 $ fields에 나열된 필드를 내보내려는 경우를 가정 해 보겠습니다.

<xsl:variable name="fields" as="xs:string*" 
    select="tokenize('001 005 007 008 020 
        100 245 260 260 300 
        520 546 650 653 700 
        856', '\s+')"/> 

현재 문제는 출력이 많은 XSLT 프로그래머는 '푸시'스타일 부르는의 입력에 존재하는 필드에 의해 형성되고 있다는 점이다. 입력이 아닌 $ 필드의 필드 목록으로 출력을 만들고 싶습니다. XSLT 프로그래머가 'pull'스타일 시트라고 부르는 것을 원할 것입니다. 우리가 스프레드 시트 같은 비 XML 시스템 용 데이터를 준비 할 때 당겨지는 스타일 시트는 구조의 변형에별로 좋지 않습니다. 그들은 또한 문제에 대해 생각할 다른 방법을 모르는 절차 적 프로그래머들에게도 일반적입니다. 이 두 가지 모두 XSLT 프로그래머가 스타일 시트를 당기는 데 약간주의를 기울이지 만, 문제를 올바르게 설명하면 풀 스타일 시트가 필요한 것입니다.

지금까지 말한 바에 따르면 <xsl:apply-templates select="*/*" />을 사용하여 입력을 처리하여 출력을 구성/생성하는 것이 문제라는 것을 알 수 있습니다. 입력에 546 개의 필드가 없으면 많은 불필요한 노력없이 탭이 삽입 될 기회가 없습니다.

그랜드 아이들을 반복하는 현재 apply-templates을 $ fields의 필드 번호를 반복하는 구문으로 교체하고 각 필드 번호에 대해 탭과 기타 적절한 정보를 출력하려는 ​​경우 입력에 해당 번호의 필드가 있는지 여부에 따라 적절한 정보가 달라집니다. XSLT 3에서.0을 사용하면 템플릿을 일련의 값에 적용 할 수 있으므로 <xsl:apply-templates select="$fields"/>을 작성할 수 있지만 2.0에서는 옵션이 아닙니다. 2.0에서 사용할 수있는 옵션은 다음과 같습니다

  • 가없는 문자열의 순서로하지만 요소의 순서로 $ 필드를 나타냅니다; <xsl:apply-templates select="$fields"/>을 호출하여 원하는 필드 번호를 반복합니다. 입력 문서에서 노드를 전달해야한다는 것을 잊지 말아야합니다 (루트가 좋은 선택입니다). 필드 번호에 대한 템플릿에서 다시 가져올 수 있습니다.

  • $ fields를 매개 변수로 사용하여 명명 된 템플릿을 호출합니다. 명명 된 템플릿에서 목록에서 첫 번째 필드 번호를 선택하고 처리 한 다음 동일한 이름의 템플릿을 반복적으로 호출하고 나머지는 목록에서 호출합니다. 첫 x 째 필드 x 호가 없으면 필드 x 호의 시퀀스는 비어 있으며 완료됩니다.

  • 방금 ​​설명한 명명 된 템플릿과 같은 방식으로 작동하는 재귀 함수를 작성하십시오.

  • 하나 개 MARC 레코드에 대해 하나 개의 필드 번호를 처리하는 함수를 작성하고하는 XPath for 표현에서 호출 :

    :

    <xsl:template match="marc:record"> 
        ... 
        <xsl:sequence select="for $fn in $fields 
        return my:one-field-one-record($fn, .) 
        "/> 
        ... 
    </xsl:template> 
    
+0

"* 내보낼 필드 목록이없는 경우 *"나는 OP에서 모든 레코드에서 사용 된 모든 고유 필드를 원한다고 확실히 생각한다고 생각 했습니까? –

+0

@ C.M.Sperberg-McQueen, 감사합니다. 필드 목록은 MARC 레코드의 주어진 파일에 존재하는 고유 한 필드/서브 필드 쌍의 집합입니다. 나는 미리 정의 된 목록이 없다. 파일의 한 레코드에 653 필드가 있고 다른 필드에이 필드가없는 경우 해당 필드는 MARC 레코드의 현재 파일 컨텍스트 내에서 두 번째 레코드에서 "누락"됩니다. – tat

+0

@ michael.hor257k, 당신은 I보다 OP를 더 잘 이해 한 것으로 보입니다. 설명 후에도 문제 설명에서 해당 정보를 보는 데 실패했습니다. –

2

XSLT 1.0에서도 가능합니다.

다음 솔루션은 고유 태그의 문서 전체 목록을 기반으로 만들어지며 모든 레코드에 대해 해당 목록을 반복합니다. 결과적으로 특정 태그가 레코드에없는 경우에도 구분 기호를 출력 할 수 있습니다.

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:marc="http://www.loc.gov/MARC21/slim" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
> 
    <xsl:output method="text" encoding="Windows-1252" /> 

    <xsl:param name="hDelim" select="'&#x9;'" /><!-- vertical delimiter --> 
    <xsl:param name="vDelim" select="'&#xA;'" /><!-- horizontal delimiter --> 
    <xsl:param name="sDelim" select="'|'" /><!-- subfield delimiter --> 

    <!-- group tags by @tag + @code --> 
    <xsl:key name="kAllTags" match="marc:controlfield | marc:subfield" use=" 
    concat(@tag, ../@tag, @code) 
    " /> 
    <!-- group tags by record ID + @tag + @code --> 
    <xsl:key name="kRecordTags" match="marc:controlfield | marc:subfield" use=" 
    concat(generate-id(ancestor::marc:record), ':', @tag|../@tag, @code) 
    " /> 
    <!-- build a list of unique tags to iterate over --> 
    <xsl:variable name="uniqueTags" select=" 
    (//marc:controlfield | //marc:subfield)[ 
     generate-id() = generate-id(key('kAllTags', concat(@tag | ../@tag, @code))) 
    ] 
    " /> 

    <xsl:template match="marc:collection"> 
    <!-- write header line --> 
    <xsl:text>leader</xsl:text> 
    <xsl:value-of select="$hDelim" /> 

    <xsl:apply-templates select="$uniqueTags" mode="head"> 
     <xsl:sort select="concat(@tag|../@tag, @code)" /> 
    </xsl:apply-templates> 
    <xsl:value-of select="$vDelim" /> 

    <!-- write individual records --> 
    <xsl:apply-templates select="marc:record" /> 
    </xsl:template> 

    <xsl:template match="marc:record"> 
    <xsl:variable name="recordId" select="generate-id()" /> 

    <xsl:value-of select="marc:leader" /> 
    <xsl:value-of select="$hDelim" /> 

    <!-- for each unique tag, find the fields that have that tag on this record --> 
    <xsl:for-each select="$uniqueTags"> 
     <xsl:variable name="tagKey" select="concat($recordId, ':', @tag|../@tag, @code)" /> 
     <xsl:apply-templates select="key('kRecordTags', $tagKey)" mode="data" /> 
     <xsl:if test="position() != last()"><xsl:value-of select="$hDelim" /></xsl:if> 
    </xsl:for-each> 
    <xsl:if test="position() != last()"><xsl:value-of select="$vDelim" /></xsl:if> 
    </xsl:template> 

    <xsl:template match="marc:controlfield | marc:subfield" mode="head"> 
    <xsl:value-of select="concat(@tag|../@tag, @code)" /> 
    <xsl:if test="position() != last()"><xsl:value-of select="$hDelim" /></xsl:if> 
    </xsl:template> 

    <xsl:template match="marc:controlfield | marc:subfield" mode="data"> 
    <xsl:value-of select="normalize-space()" /> 
    <xsl:if test="position() != last()"><xsl:value-of select="$sDelim" /></xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

이 템플릿은 사용자의 입력 데이터로 생성하여 (희망 대표) 예에서 예상대로

 
leader 001 005 007 008 020a 1004 100a 245a 260b 260c 300a 520a 546a 650a 653a 7004 700a 856u 856z 
02179 am a 002893u   12789 20120521 cuuuu---auuuu 120521s|||| xx o 0 u ||| | 9789089640574 Rooij van ,Robert aut New Perspectives on Games and Interaction Amsterdam University Press 2008 1 electronic resource (330 p.) This volume is a collection of papers ... Mathematics|Philosophy (General)|Economic theory. Demography Economics|Philosophy|Mathematics|Economie|Filosofie|Wiskunde Apt ,Krzysztof aut http://www.doabooks.org/doab?func=fulltext&rid=12789|http://www.oapen.org/download?type=document&docid=340074 Description of rights in Directory of Open Access Books (DOAB): Attribution Non-commercial (CC by-nc) 
01452 am a 001933u   15497 20140217 cuuuu---auuuu 140217s|||| xx o 0 u ||| | 9788867050673 Emanuele Haus aut Dynamics of an elastic satellite with internal friction. Ledizioni - LediPublishing 2013 1 electronic resource (p.) n this thesis, we study the dynamics... Mathematics    http://www.doabooks.org/doab?func=fulltext&rid=15497|http://www.ledizioni.it/stag/wp-content/uploads/2014/02/tesi_haus.pdf Description of rights in Directory of Open Access Books (DOAB): Attribution Non-commercial Share Alike (CC by-nc-sa) english 
+0

"* XSLT 1.0에서도 가능합니다. *"물론입니다.하지만 문제는 XSLT 2.0 태그가 붙은 것입니까? –

+4

하지만 시작한 후에 대답을 버리고 싶지 않았습니다. 또한 XSLT 2.0 프로세서는 1을 실행할 수 있습니다.0 스타일 시트이므로 주제와 정확히 일치하지는 않습니다. :) – Tomalak