2015-01-16 4 views
-3

이전과 비슷한 질문을했지만 여기서는 약간 혼란 스럽습니다.XSLT 요소를 특성으로 변환하고 요소를 제거합니다. XML

XML이있어서 일부 요소를 상위 요소의 특성으로 변환하려고합니다. 이미 한 요소에 대해이 작업을 수행하고 있지만 다른 요소에 대해 수행하려고합니다. XSLT 코드를 복사하고 변경해야하는 부분의 이름을 바꾸는 경우가 될 것이라고 생각했지만 예상대로 작동하지 않습니다. 요소에서 노드를 제거하지만 속성으로 변경하지는 않습니다. 그냥 사라지고있어.

다른 요소와 비교할 때 값에 따라 요소를 제거하려고합니다. 이 작업은 내 XSLT의 다른 요소에서도 수행되지만 코드를 복사 할 때 동일한 결과를 얻지 못하는 것 같습니다. "task_info"의 "task_seq_id"가 "press_section"의 "sequence_id"와 일치하지 않으면 "press_section"에 중첩 된 "task_info"요소를 제거하려고합니다.

마지막으로, 필자는 XSLT가 XML에서 "dataroot"요소를 더 이상 제거하지 않고 있음을 발견했습니다.

나는 모든 정직함에서 내가 여기서하고있는 것을 정말로 볼 수 없기 때문에 도움이된다.

감사합니다.

내 입력 XML은 다음과 같습니다.

<?xml version="1.0" encoding="UTF-8"?> 
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2015-01-16T10:32:47"> 
<order> 
<ORDERPK>4</ORDERPK> 
<job_id>S019191-1</job_id> 
<site_code>DG</site_code> 
<Replace>true</Replace> 
<job_description>TEST</job_description> 
<order_qty>2000</order_qty> 
<depth>10</depth> 
<width>8</width> 
<cover_pagination>4</cover_pagination> 
<text_pagination>12</text_pagination> 
<delivery_commence_date>15/1/2014</delivery_commence_date> 
<job_site>DG</job_site> 
<managing_printer>DG</managing_printer> 
<is_managing_printer>True</is_managing_printer> 
</order> 
<master_version> 
<ORDER>3</ORDER> 
<version_code>COMM</version_code> 
<version_common>true</version_common> 
<version_finished>false</version_finished> 
<version_description>common</version_description> 
<version_nett_qty>20000</version_nett_qty> 
<version_special_qty>0</version_special_qty> 
</master_version> 
<master_version> 
<ORDER>4</ORDER> 
<version_code>COMM</version_code> 
<version_common>true</version_common> 
<version_finished>false</version_finished> 
<version_description>common</version_description> 
<version_nett_qty>2000</version_nett_qty> 
</master_version> 
<press_section> 
<ORDER>3</ORDER> 
<signature_id>001</signature_id> 
<sequence_id>0</sequence_id> 
<sequence_alpha>A</sequence_alpha> 
<description>4pp Cover</description> 
<pagination>4</pagination> 
<trim_size>10 x 8</trim_size> 
</press_section> 
<press_section> 
<ORDER>4</ORDER> 
<signature_id>001</signature_id> 
<sequence_id>0</sequence_id> 
<sequence_alpha>A</sequence_alpha> 
<description>4pp Cover</description> 
<pagination>4</pagination> 
<trim_size>10 x 8</trim_size> 
</press_section> 
<press_section> 
<ORDER>4</ORDER> 
<signature_id>001</signature_id> 
<sequence_id>1</sequence_id> 
<sequence_alpha>A</sequence_alpha> 
<description>6pp Cover</description> 
<pagination>6</pagination> 
<trim_size>10 x8</trim_size> 
</press_section> 
<version> 
<ORDER>3</ORDER> 
<version_code>COMM</version_code> 
</version> 
<version> 
<ORDER>4</ORDER> 
<version_code>COMM</version_code> 
</version> 
<task_info_press_section> 
<ORDER>3</ORDER> 
<PRESS_x0020_SECTION>3</PRESS_x0020_SECTION> 
<confirmed>true</confirmed> 
<maintenance>false</maintenance> 
<provisional>false</provisional> 
<task_sub_job_id>S026500-1-001COMM</task_sub_job_id> 
<task_seq_id>0</task_seq_id> 
<task_description>4ppCover</task_description> 
<task_qty_rqd>20000</task_qty_rqd> 
<task_resource_id>2</task_resource_id> 
</task_info_press_section> 
<task_info_press_section> 
<ORDER>4</ORDER> 
<PRESS_x0020_SECTION>4</PRESS_x0020_SECTION> 
<confirmed>-1</confirmed> 
<maintenance>0</maintenance> 
<provisional>0</provisional> 
<task_sub_job_id>S019191-1-001COMM</task_sub_job_id> 
<task_seq_id>0</task_seq_id> 
<task_description>4pp Cover</task_description> 
<task_qty_rqd>1500</task_qty_rqd> 
<task_resource_id>1</task_resource_id> 
</task_info_press_section> 
<task_info_press_section> 
<ORDER>4</ORDER> 
<PRESS_x0020_SECTION>4</PRESS_x0020_SECTION> 
<confirmed>-1</confirmed> 
<maintenance>0</maintenance> 
<provisional>0</provisional> 
<task_sub_job_id>S019191-1-001COMM</task_sub_job_id> 
<task_seq_id>1</task_seq_id> 
<task_description>6pp Cover</task_description> 
<task_qty_rqd>500</task_qty_rqd> 
<task_resource_id>1</task_resource_id> 
</task_info_press_section> 
</dataroot> 

여기에 XSLT 1이 있습니다.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 


    <xsl:template match="/"> 
    <orders xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tg="http://www.technique-group.com" xsi:schemaLocation="http://www.technique-group.com/schemas TGScheduleImport_v1.4.xsd" tg:version="1.2"> 
     <xsl:apply-templates/> 
    </orders> 
    </xsl:template> 

    <!-- remove elements that don't match order --> 
    <xsl:template match="master_version[not(ORDER = //order/ORDERPK)]"/> 
    <xsl:template match="press_section[not(ORDER = //order/ORDERPK)]"/> 
    <xsl:template match="version[not(ORDER = //order/ORDERPK)]"/> 
    <xsl:template match="task_info_press_section[not(ORDER = //order/ORDERPK)]"/> 
    <xsl:template match="task_info_post_press[not(ORDER = //order/ORDERPK)]"/> 
    <xsl:template match="post_press_version[not(ORDER = //order/ORDERPK)]"/> 

    <!-- removed unwanted nodes from all elements --> 
    <xsl:template match="ORDER"/> 
    <xsl:template match="ORDERPK"/> 
    <xsl:template match="PRESS_x0020_SECTION"/> 
    <xsl:template match="POST_x0020_PRESS"/> 


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


    <!-- create attributes in order element --> 
    <xsl:template match="dataroot"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()[not(self::*)]|order"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="job_id | site_code | replace | Replace"/> 

    <xsl:template match="order"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()[not(self::*)]|task_info_press_section"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="confirmed | maintenance | provisional"/> 


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


    <!-- nest specified element within matched element --> 
    <xsl:template match="press_section"> 
    <press_section> 
     <xsl:apply-templates select="node()"/> 
     <xsl:apply-templates select="../version"/> 
    </press_section> 
    </xsl:template> 

    <xsl:template match="version"> 
    <version> 
     <xsl:apply-templates select="node()"/> 
     <xsl:apply-templates select="../task_info_press_section"/> 
    </version> 
    </xsl:template> 

    <xsl:template match="post_press_version"> 
    <post_press_version> 
     <xsl:apply-templates select="node()"/> 
     <xsl:apply-templates select="../task_info_post_press"/> 
    </post_press_version> 
    </xsl:template> 

    <xsl:template match="task_info_press_section"> 
    <task_info_press_section confirmed="{confirmed}" maintenance="{maintenance}" provisional="{provisional}"> 
     <xsl:apply-templates select="node()"/> 
     <xsl:apply-templates select="../*[not(self::task_info_press_section)]"/> 
    </task_info_press_section> 
    </xsl:template> 


    <!-- nest all elements within order and create attributes --> 
    <xsl:template match="order"> 
    <order job_id="{job_id}" site_code="{site_code}" replace="{Replace}"> 
     <xsl:apply-templates select="node()"/> 
     <xsl:apply-templates select="../*[not(self::order) and not(self::version) and not(self::task_info_press_section) and not(self::task_info_post_press)]"/> 
    </order> 
    </xsl:template> 


    <!-- rename elements to specified name --> 
    <xsl:template match="task_info_press_section"> 
     <xsl:element name="task_info"> 
     <xsl:apply-templates/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="task_info_post_press"> 
     <xsl:element name="task_info"> 
     <xsl:apply-templates/> 
     </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

여기에 XSLT 2가 있습니다.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:tg="http://www.technique-group.com" 
    version="1.2"> 

<xsl:template match="*"> 
    <xsl:element name="tg:{local-name()}" namespace="http://www.technique-group.com"> 
    <xsl:copy-of select="@*"/> 
    <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 

내 출력 XML은 다음과 같습니다.

<?xml version="1.0" encoding="UTF-8"?> 
<tg:orders xmlns:tg="http://www.technique-group.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.technique-group.com/schemas TGScheduleImport_v1.4.xsd" tg:version="1.2"> 
    <tg:dataroot generated="2015-01-16T10:32:47"> 
     <tg:order job_id="S019191-1" site_code="DG" replace="true"> 
     <tg:job_description>TEST</tg:job_description> 
     <tg:order_qty>2000</tg:order_qty> 
     <tg:depth>10</tg:depth> 
     <tg:width>8</tg:width> 
     <tg:cover_pagination>4</tg:cover_pagination> 
     <tg:text_pagination>12</tg:text_pagination> 
     <tg:delivery_commence_date>15/1/2014</tg:delivery_commence_date> 
     <tg:job_site>DG</tg:job_site> 
     <tg:managing_printer>DG</tg:managing_printer> 
     <tg:is_managing_printer>True</tg:is_managing_printer> 
     <tg:master_version> 
      <tg:version_code>COMM</tg:version_code> 
      <tg:version_common>true</tg:version_common> 
      <tg:version_finished>false</tg:version_finished> 
      <tg:version_description>common</tg:version_description> 
      <tg:version_nett_qty>2000</tg:version_nett_qty> 
     </tg:master_version> 
     <tg:press_section> 
      <tg:signature_id>001</tg:signature_id> 
      <tg:sequence_id>0</tg:sequence_id> 
      <tg:sequence_alpha>A</tg:sequence_alpha> 
      <tg:description>4pp Cover</tg:description> 
      <tg:pagination>4</tg:pagination> 
      <tg:trim_size>10 x 8</tg:trim_size> 
      <tg:version> 
       <tg:version_code>COMM</tg:version_code> 
       <tg:task_info> 
        <tg:task_sub_job_id>S019191-1-001COMM</tg:task_sub_job_id> 
        <tg:task_seq_id>0</tg:task_seq_id> 
        <tg:task_description>4pp Cover</tg:task_description> 
        <tg:task_qty_rqd>1500</tg:task_qty_rqd> 
        <tg:task_resource_id>1</tg:task_resource_id> 
       </tg:task_info> 
       <tg:task_info> 
        <tg:task_sub_job_id>S019191-1-001COMM</tg:task_sub_job_id> 
        <tg:task_seq_id>1</tg:task_seq_id> 
        <tg:task_description>6pp Cover</tg:task_description> 
        <tg:task_qty_rqd>500</tg:task_qty_rqd> 
        <tg:task_resource_id>1</tg:task_resource_id> 
       </tg:task_info> 
      </tg:version> 
     </tg:press_section> 
     <tg:press_section> 
      <tg:signature_id>001</tg:signature_id> 
      <tg:sequence_id>1</tg:sequence_id> 
      <tg:sequence_alpha>A</tg:sequence_alpha> 
      <tg:description>6pp Cover</tg:description> 
      <tg:pagination>6</tg:pagination> 
      <tg:trim_size>10 x8</tg:trim_size> 
      <tg:version> 
       <tg:version_code>COMM</tg:version_code> 
       <tg:task_info> 
        <tg:task_sub_job_id>S019191-1-001COMM</tg:task_sub_job_id> 
        <tg:task_seq_id>0</tg:task_seq_id> 
        <tg:task_description>4pp Cover</tg:task_description> 
        <tg:task_qty_rqd>1500</tg:task_qty_rqd> 
        <tg:task_resource_id>1</tg:task_resource_id> 
       </tg:task_info> 
       <tg:task_info> 
        <tg:task_sub_job_id>S019191-1-001COMM</tg:task_sub_job_id> 
        <tg:task_seq_id>1</tg:task_seq_id> 
        <tg:task_description>6pp Cover</tg:task_description> 
        <tg:task_qty_rqd>500</tg:task_qty_rqd> 
        <tg:task_resource_id>1</tg:task_resource_id> 
       </tg:task_info> 
      </tg:version> 
     </tg:press_section> 
     </tg:order> 
    </tg:dataroot> 
</tg:orders> 

여기 내 원하는 출력입니다.

<?xml version="1.0" encoding="UTF-8"?> 
<tg:orders xmlns:tg="http://www.technique-group.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.technique-group.com/schemas TGScheduleImport_v1.4.xsd" tg:version="1.2"> 
     <tg:order job_id="S019191-1" site_code="DG" replace="true"> 
     <tg:job_description>TEST</tg:job_description> 
     <tg:order_qty>2000</tg:order_qty> 
     <tg:depth>10</tg:depth> 
     <tg:width>8</tg:width> 
     <tg:cover_pagination>4</tg:cover_pagination> 
     <tg:text_pagination>12</tg:text_pagination> 
     <tg:delivery_commence_date>15/1/2014</tg:delivery_commence_date> 
     <tg:job_site>DG</tg:job_site> 
     <tg:managing_printer>DG</tg:managing_printer> 
     <tg:is_managing_printer>True</tg:is_managing_printer> 
     <tg:master_version> 
      <tg:version_code>COMM</tg:version_code> 
      <tg:version_common>true</tg:version_common> 
      <tg:version_finished>false</tg:version_finished> 
      <tg:version_description>common</tg:version_description> 
      <tg:version_nett_qty>2000</tg:version_nett_qty> 
     </tg:master_version> 
     <tg:press_section> 
      <tg:signature_id>001</tg:signature_id> 
      <tg:sequence_id>0</tg:sequence_id> 
      <tg:sequence_alpha>A</tg:sequence_alpha> 
      <tg:description>4pp Cover</tg:description> 
      <tg:pagination>4</tg:pagination> 
      <tg:trim_size>10 x 8</tg:trim_size> 
      <tg:version> 
       <tg:version_code>COMM</tg:version_code> 
       <tg:task_info confirmed="true" maintenance="false" provisional="false"> 
        <tg:task_sub_job_id>S019191-1-001COMM</tg:task_sub_job_id> 
        <tg:task_seq_id>0</tg:task_seq_id> 
        <tg:task_description>4pp Cover</tg:task_description> 
        <tg:task_qty_rqd>1500</tg:task_qty_rqd> 
        <tg:task_resource_id>1</tg:task_resource_id> 
       </tg:task_info> 
      </tg:version> 
     </tg:press_section> 
     <tg:press_section> 
      <tg:signature_id>001</tg:signature_id> 
      <tg:sequence_id>1</tg:sequence_id> 
      <tg:sequence_alpha>A</tg:sequence_alpha> 
      <tg:description>6pp Cover</tg:description> 
      <tg:pagination>6</tg:pagination> 
      <tg:trim_size>10 x8</tg:trim_size> 
      <tg:version> 
       <tg:version_code>COMM</tg:version_code> 
       <tg:task_info confirmed="true" maintenance="false" provisional="false"> 
        <tg:task_sub_job_id>S019191-1-001COMM</tg:task_sub_job_id> 
        <tg:task_seq_id>1</tg:task_seq_id> 
        <tg:task_description>6pp Cover</tg:task_description> 
        <tg:task_qty_rqd>500</tg:task_qty_rqd> 
        <tg:task_resource_id>1</tg:task_resource_id> 
       </tg:task_info> 
      </tg:version> 
     </tg:press_section> 
     </tg:order> 
</tg:orders> 
+1

이 같은 문제를 설명하여 입력 XML의 최소 버전을 게시 할 수 이름을 변경하고있다 그것에 대한 원하는 출력. –

+0

@ LingamurthyCS가 질문을 편집했습니다. –

답변

3

첫 번째 요점은 기억해야하며, 동일한 요소에 일치하는 두 개의 템플릿이있는 경우 오류가 발생합니다. order과 일치하는 템플릿이 두 개 있으며 task_info_press_section 두 개가 일치합니다. 각각 하나씩 만 있어야합니다.

당신이 달성하고자하는 것이 아니라 그것을 달성하기 위해 무엇을보고 있는지, 나는 정말로 당신이 다른 접근법을 취해야한다고 생각합니다. order 요소에 하위 요소를 추가하려고하고 있으며 모든 템플릿을 선택하지만 템플릿 예외가있는 경우 주문 번호와 일치하지 않는 요소는 제외시켜야합니다.

다른 방법으로는 순서에 따라 복사 할 하위 요소를 명시 적으로 선택하는 방법이 있습니다. 당신은 "순서"당신이 명시 적으로

<xsl:template match="order"> 
    <order job_id="{job_id}" site_code="{site_code}" replace="{Replace}"> 
     <xsl:apply-templates select="@*|node()" /> 
     <xsl:apply-templates select="key('master_version', ORDERPK)"/> 
     <xsl:apply-templates select="key('press_section', ORDERPK)"/> 
    </order> 
</xsl:template> 

같은 중첩 된 "master_version"와 "press_section"을 설정합니다 일치하는 템플릿, 그래서 ... 키를 사용하여 비교적 쉽게

<xsl:key name="master_version" match="master_version" use="ORDER" /> 
<xsl:key name="press_section" match="press_section" use="ORDER" /> 
<xsl:key name="version" match="version" use="ORDER" /> 
<xsl:key name="task_info_press_section" match="task_info_press_section" use="ORDER" /> 

을 수행 할 수 있습니다 task_info_press_section의 중첩을 press_section에 넣으려면 version과 일치하는 템플릿을 사용합니다.그런 다음 task_info_press_section을 선택한 키에 추가 조건을 더 쉽게 추가 할 수 있습니다. 이 경우

<xsl:template match="press_section"> 
    <press_section> 
    <xsl:apply-templates select="node()"/> 
    <version> 
     <xsl:apply-templates select="key('version', ORDER)/node()"/> 
     <xsl:apply-templates select="key('task_info_press_section', ORDER)[task_seq_id = current()/sequence_id]"/> 
    </version> 
    </press_section> 
</xsl:template> 

그래서 current()는 현재 press_section

dataroot이 제거되지 않는 이유에 대한 질문에 대답이 훨씬 단순화 된 XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:key name="master_version" match="master_version" use="ORDER" /> 
    <xsl:key name="press_section" match="press_section" use="ORDER" /> 
    <xsl:key name="version" match="version" use="ORDER" /> 
    <xsl:key name="task_info_press_section" match="task_info_press_section" use="ORDER" /> 

    <xsl:template match="ORDER"/> 
    <xsl:template match="ORDERPK"/> 
    <xsl:template match="PRESS_x0020_SECTION"/> 
    <xsl:template match="job_id | site_code | replace | Replace"/> 
    <xsl:template match="confirmed | maintenance | provisional"/> 

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


     <xsl:template match="dataroot"> 
    <orders xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:od="urn:schemas-microsoft-com:officedata" xmlns:tg="http://www.technique-group.com" xsi:schemaLocation="http://www.technique-group.com/schemas TGScheduleImport_v1.4.xsd" tg:version="1.2"> 
     <xsl:apply-templates select="order"/> 
    </orders> 
    </xsl:template> 
    <xsl:template match="order"> 
     <order job_id="{job_id}" site_code="{site_code}" replace="{Replace}"> 
     <xsl:apply-templates select="@*|node()" /> 
     <xsl:apply-templates select="key('master_version', ORDERPK)"/> 
     <xsl:apply-templates select="key('press_section', ORDERPK)"/> 
     </order> 
    </xsl:template> 

    <xsl:template match="press_section"> 
    <press_section> 
     <xsl:apply-templates select="node()"/> 
     <version> 
      <xsl:apply-templates select="key('version', ORDER)/node()"/> 
      <xsl:apply-templates select="key('task_info_press_section', ORDER)[task_seq_id = current()/sequence_id]"/> 
     </version> 
    </press_section> 
    </xsl:template> 

    <xsl:template match="task_info_press_section"> 
    <task_info confirmed="{confirmed}" maintenance="{maintenance}" provisional="{provisional}"> 
     <xsl:apply-templates select="node()"/> 
    </task_info> 
    </xsl:template> 

주, 시도를 의미 명시 적으로 출력에 복사하기 때문입니다.

<xsl:template match="dataroot"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()[not(self::*)]|order"/> 
    </xsl:copy> 
</xsl:template> 
새로운 스타일 시트에서

, 내가 효과적으로 그래서 dataroot 효율적이며, 하나에 \dataroot 일치하는 템플릿을 결합 orders

<xsl:template match="dataroot"> 
    <orders xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:od="urn:schemas-microsoft-com:officedata" xmlns:tg="http://www.technique-group.com" xsi:schemaLocation="http://www.technique-group.com/schemas TGScheduleImport_v1.4.xsd" tg:version="1.2"> 
     <xsl:apply-templates select="order"/> 
    </orders> 
    </xsl:template> 
+0

당신은 천재적입니다, 정말 고마워요! 내가 가지고있는 유일한 불만은 "주문"요소 다음에 사본을 만드는 것이지만, 나는 그것을 제거하는 방법을 찾아 내려고 시도 할 것이다. 고마워! –

+1

사과드립니다. 이 문제를 해결하기 위해 내 대답을 편집했습니다. 그것은 "주문"과 일치하는 템플릿의 "주문"요소를 명시 적으로 선택하는 경우에 불과합니다. –

+0

사과 할 필요가 없습니다. 도움에 매우 감사드립니다. 정말 고마워요! –

관련 문제