2017-04-13 10 views
0

이것은 모든 XPath 및 XSLT 천재를위한 것입니다!XPath XSLT 조건부 처리 배열

이것은 XLIFF 파일에서 추출한 것으로, 속성 값이 ID 번호 배열과 일치하는 태그 사이의 텍스트를 삭제해야하지만 중요한 것은 특정 태그 경계 내에있는 경우에만 <target> 태그가 있어야합니다. 정확한.

이것은 XSLT와 전문가 중 한 명에게 간단한 작업 일지 모르지만 이제는 내 마지막 수단에 대해 여러 줄에 걸쳐 긍정적이고 부정적인 둘러보기로 인해 충분히 안정적이지 않은 Perl로이 문제를 처리하려고 애 쓰고 있습니다. .

아래의 스 니펫에서 예를 들어 (아래의 풀러 예 참조) 태그 내에 중첩되어있는 경우에만 <emp> 태그와 pid = "569"및 pid = "570"태그 사이의 텍스트를 제거해야합니다. <alt-source<t><emp> 트리에서 pid = "569"및 pid = "570"인 동일한 텍스트는 그대로 유지해야합니다.

  <alt-source> 
        <t id="4507"> 
         <emp ptype="para" pid="569">Q27a.</emp> 
         <emp ptype="para" pid="570"> 
          <t id="4516">Before 1996</t><t id="4537"> [this/that] </t>did not exist</emp> 
        </t> 
       </alt-source> 
       <target> 
        <t id="4507"> 
         <emp ptype="para" pid="569">Q27a.</emp> 
         <emp ptype="para" pid="570"> 
          <t id="4516">Before 1996</t><t id="4537"> [this/that] </t>did not exist</emp> 
        </t> 
       </target> 

내부의 텍스트에도 태그가 삽입 될 수 있으며 공백이있을 수 있습니다. 아래의 <igroup> 마지막 부분의 <target> 트리에는 둘 이상의 "일치하는"항목이있을 수 있습니다. 이 파일에는 수천 개의 igroup 노드가있을 수 있으며 igroup은 최상위 수준이 아닙니다.

예를 들어 pid 배열에서 우리는 [569 570 587]을 가지므로 <emp>의 노드가 인 노드 만이 해당 pid와 일치하는 "pid"가 처리되어야합니다. 내부 텍스트는 포함 태그를 포함하여 제거해야합니다 (예 : <emp ptype="para" pid="587"></emp>).

XSLT에서도 이와 같은 작업이 가능합니까?

도움이 될 것입니다.

  <igroup> 
       <source> 
        <t id="4612">3 times per day or more</t> 
       </source> 
       <alt-source> 
        <t id="4612"> 
         <emp ptype="para" pid="585">3 times per day or more</emp> 
        </t> 
       </alt-source> 
       <target> 
        <t id="4612"> 
         <emp ptype="para" pid="585">3 fois par jour ou plus</emp> 
        </t> 
       </target> 
      <igroup> 
      <igroup> 
       <source> 
        <t id="4507">Q27a. </t><t id="4516">Before 1996</t><t id="4537"> [this/that] </t>did not exist</emp> 
       </source> 
       <alt-source> 
        <t id="4507"> 
         <emp ptype="para" pid="569">Q27a.</emp> 
         <emp ptype="para" pid="570"> 
          <t id="4516">Before 1996</t><t id="4537"> [this/that] </t>did not exist</emp> 
        </t> 
       </alt-source> 
       <target> 
        <t id="4507"> 
         <emp ptype="para" pid="569">Q27a.</emp> 
         <emp ptype="para" pid="570"> 
          <t id="4516">Before 1996</t><t id="4537"> [this/that] </t>did not exist</emp> 
        </t> 
       </target> 
      </igroup> 
      <igroup> 
       <source>a.</source> 
       <alt-source> 
        <emp ptype="para" pid="586">a.</emp> 
        <emp ptype="para" pid="587">b.</emp> 
        <emp ptype="para" pid="588">c.</emp> 
       </alt-source> 
       <target> 
        <emp ptype="para" pid="586">a.</emp> 
        <emp ptype="para" pid="587">b.</emp> 
        <emp ptype="para" pid="588">c.</emp> 
       </target> 
      </igroup> 
+1

나는 당신의 질문을 이해하지 않습니다. 기대되는 결과물을 보는 것이 도움이 될 수 있지만 용어는 모두 잘못되었습니다. 예를 들어 텍스트에는 '포함 태그'를 사용할 수 없습니다. - 추신 XSLT 1.0 또는 2.0을 사용하고 있는지 명시하십시오. –

+0

안녕하세요, Michael입니다. 제 용어가 정확하지 않은 경우에 고마워합니다. XPath 또는 XSLT에 익숙하지 않습니다. 내장 태그가 있다고 말하면,'emp' 태그 안에있는't' 태그에 대해 위의 구조를 살펴보십시오. 그것이 내가 의미했던 것입니다. XSLT 1.0 또는 2.0을 사용할 수 있습니다.이 스크립트는 Perl 스크립트에서 실행합니다. – user3012857

답변

2

나는 당신이 원하는 것을 얻는다고 믿습니다.

예제 XML에는 문제가있어서 조정해야했습니다.

레벨을 건너 뛰는 데 사용할 수있는 //을 사용할 수 있습니다.

XSLT :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <!-- this copies all other elements --> 
    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <!-- this intercepts our specific elements --> 
    <xsl:template match="target//emp[@pid='569' or @pid='570' or @pid='587']"> 
    <!-- this copies element name --> 
    <xsl:copy> 
     <!-- this copies all its attributes --> 
     <xsl:copy-of select="@*"/> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

편집 XML :

<igroup> 
    <source> 
    <t id="4612">3 times per day or more</t> 
    </source> 
    <alt-source> 
    <t id="4612"> 
     <emp ptype="para" pid="585">3 times per day or more</emp> 
    </t> 
    </alt-source> 
    <target> 
    <t id="4612"> 
     <emp ptype="para" pid="585">3 fois par jour ou plus</emp> 
    </t> 
    </target> 
    <igroup> 
    <igroup> 
     <source> 
     <emp ptype="para" pid="570"> 
      <t id="4507">Q27a. </t> 
      <t id="4516">Before 1996</t> 
      <t id="4537"> [this/that] </t> 
      did not exist 
     </emp> 
     </source> 
     <alt-source> 
     <t id="4507"> 
      <emp ptype="para" pid="569">Q27a.</emp> 
      <emp ptype="para" pid="570"> 
      <t id="4516">Before 1996</t> 
      <t id="4537"> [this/that] </t> 
      did not exist 
      </emp> 
     </t> 
     </alt-source> 
     <target> 
     <t id="4507"> 
      <emp ptype="para" pid="569">Q27a.</emp> 
      <emp ptype="para" pid="570"> 
      <t id="4516">Before 1996</t> 
      <t id="4537"> [this/that] </t> 
      did not exist 
      </emp> 
     </t> 
     </target> 
    </igroup> 
    <igroup> 
     <source>a.</source> 
     <alt-source> 
     <emp ptype="para" pid="586">a.</emp> 
     <emp ptype="para" pid="587">b.</emp> 
     <emp ptype="para" pid="588">c.</emp> 
     </alt-source> 
     <target> 
     <emp ptype="para" pid="586">a.</emp> 
     <emp ptype="para" pid="587">b.</emp> 
     <emp ptype="para" pid="588">c.</emp> 
     </target> 
    </igroup> 
    </igroup> 
</igroup> 

결과 :

<?xml version="1.0" encoding="utf-8"?><igroup> 
    <source> 
    <t id="4612">3 times per day or more</t> 
    </source> 
    <alt-source> 
    <t id="4612"> 
     <emp ptype="para" pid="585">3 times per day or more</emp> 
    </t> 
    </alt-source> 
    <target> 
    <t id="4612"> 
     <emp ptype="para" pid="585">3 fois par jour ou plus</emp> 
    </t> 
    </target> 
    <igroup> 
    <igroup> 
     <source> 
     <emp ptype="para" pid="570"> 
      <t id="4507">Q27a. </t> 
      <t id="4516">Before 1996</t> 
      <t id="4537"> [this/that] </t> 
      did not exist 
     </emp> 
     </source> 
     <alt-source> 
     <t id="4507"> 
      <emp ptype="para" pid="569">Q27a.</emp> 
      <emp ptype="para" pid="570"> 
      <t id="4516">Before 1996</t> 
      <t id="4537"> [this/that] </t> 
      did not exist 
      </emp> 
     </t> 
     </alt-source> 
     <target> 
     <t id="4507"> 
      <emp ptype="para" pid="569" /> 
      <emp ptype="para" pid="570" /> 
     </t> 
     </target> 
    </igroup> 
    <igroup> 
     <source>a.</source> 
     <alt-source> 
     <emp ptype="para" pid="586">a.</emp> 
     <emp ptype="para" pid="587">b.</emp> 
     <emp ptype="para" pid="588">c.</emp> 
     </alt-source> 
     <target> 
     <emp ptype="para" pid="586">a.</emp> 
     <emp ptype="para" pid="587" /> 
     <emp ptype="para" pid="588">c.</emp> 
     </target> 
    </igroup> 
    </igroup> 
</igroup> 
+0

이것은 어떤 종류의 일치하는'emp' 요소의 ** 모든 ** 자손 노드를 제거합니다. 이것은 아마도 당신이 원하는 것이지만, 명시 적으로 기술되어야합니다. –

+0

아, 천재.완벽 해 보이네요. 네가 자손 노드에 대해 맞다. 나는 네가 알고있는 마이클에게 내 모자를 기울이고 대답을 받아 들일 수있어서 기쁘다. 나는 이제 여분의'\ @를 사용하여'' '펄에서 탈출. pid 배열이 매우 커지면 성능에 제한이 있는지 궁금합니다. 잠재적으로 수천 명이 될 수 있습니다. 시간이 말해 줄거야. 참으로 많은 감사드립니다. :-) – user3012857