2014-12-15 2 views
4

JOB_NUMBER 필드와 ORDERPK 필드를 "주문"노드의 속성으로 변환하고 싶습니다. 어떻게 누군가가 나를 보여줄 수 있습니까?부모 요소의 속성으로 자식 요소 변환하기

다음 XML이 있습니다.

<?xml version="1.0" encoding="UTF-8"?> 
<dataroot 
    xmlns:od="urn:schemas-microsoft-com:officedata" generated="2014-12-15T14:45:35"> 
    <order> 
     <ORDERPK>2</ORDERPK> 
     <JOB_x0020_NUMBER>S019191-9</JOB_x0020_NUMBER> 
     <job_description>TESTDATA</job_description> 
     <order_qty>1900</order_qty> 
     <finishing_style>PB</finishing_style> 
     <depth>10</depth> 
     <width>8</width> 
     <cover_pagination>4</cover_pagination> 
     <text_pagination>12</text_pagination> 
     <delivery_commence_date>15/12/2014</delivery_commence_date> 
     <delivery_complete_date>15/12/2014</delivery_complete_date> 
     <job_site>DG</job_site> 
     <managing_printer>DG</managing_printer> 
     <is_managing_printer>TRUE</is_managing_printer> 
     <cust_order_ref>776031</cust_order_ref> 
     <cust_code>Test</cust_code> 
     <site_cce_name>Jamie</site_cce_name> 
     <site_cce_email>[email protected]</site_cce_email> 
     <sales_person_name>Jamie Brace</sales_person_name> 
     <sales_person_email>[email protected]</sales_person_email> 
    </order> 
</dataroot> 

내 데이터를 다음과 같이 표시하고 싶습니다.

<order JOB_NUMBER="S019191-9" ORDERPK="2"> 
<job_description>TESTDATA</job_description> 
etc. 

이 XSLT는 지금까지 생각해 냈지만 모든 정직성에서는 XML 또는 XSLT에 전혀 익숙하지 않습니다.

<?xml version="1.0" encoding="UTF‐8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes" method="xml" /> 
    <xsl:template match="/order"> 
    <root> 
     <xsl:apply-templates select="order" /> 
    </root> 
    </xsl:template> 

    <xsl:template match="order"> 
    <order JOB_x0020_NUMBER="{@JOB_x0020_NUMBER}"> 
     <xsl:value-of select="order" /> 
    </order> 
    </xsl:template> 
</xsl:stylesheet> 

답변

1

너는별로 멀지 않았다. ID 템플릿으로 시작하면 출력 트리에 모든 내용이 복사됩니다. 그런 다음이 기본 무차별 복사 프로세스에 정의하려는 모든 예외에 대해 더 구체적인 템플릿을 추가하십시오.

첫 번째 템플릿은 order과 일치하고 두 개의 새로운 특성을 가진 새로운 order 요소를 출력합니다. 그 값은 속성 값 템플릿으로 검색됩니다. 그러나 이제는 속성으로 표시되는 두 요소가 출력에 나타나서는 안됩니다. 따라서 두 번째 템플리트는 이들을 일치시키고 단순히 아무것도 수행하지 않습니다.

귀하의 질문에서 나머지 자식 요소를 그대로 남겨 둘지 여부는 확실하지 않지만 order의 자식 요소는 그대로두고 싶은데 원하는 것으로 가정합니다.

스타일 시트

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

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

<xsl:output method="xml" indent="yes"/> 

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

<xsl:template match="order"> 
    <order JOB_NUMBER="{JOB_x0020_NUMBER}" ORDERPK="{ORDERPK}"> 
     <xsl:apply-templates/> 
    </order> 
</xsl:template> 

<xsl:template match="JOB_x0020_NUMBER | ORDERPK"/> 

</xsl:stylesheet> 

XML 출력

<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2014-12-15T14:45:35"> 
    <order JOB_NUMBER="S019191-9" ORDERPK="2"> 
     <job_description>TESTDATA</job_description> 
     <order_qty>1900</order_qty> 
     <finishing_style>PB</finishing_style> 
     <depth>10</depth> 
     <width>8</width> 
     <cover_pagination>4</cover_pagination> 
     <text_pagination>12</text_pagination> 
     <delivery_commence_date>15/12/2014</delivery_commence_date> 
     <delivery_complete_date>15/12/2014</delivery_complete_date> 
     <job_site>DG</job_site> 
     <managing_printer>DG</managing_printer> 
     <is_managing_printer>TRUE</is_managing_printer> 
     <cust_order_ref>776031</cust_order_ref> 
     <cust_code>Test</cust_code> 
     <site_cce_name>Jamie</site_cce_name> 
     <site_cce_email>[email protected]</site_cce_email> 
     <sales_person_name>Jamie Brace</sales_person_name> 
     <sales_person_email>[email protected]</sales_person_email> 
    </order> 
</dataroot> 
그런데

, 당신의 XML에 사용되지 않습니다 네임 스페이스 선언이 :

xmlns:od="urn:schemas-microsoft-com:officedata" 

결과에서 제외 할 수 있습니다. XSLT 2.0을 사용할 수 있다면 copy-namespaces="no"을 사용할 수 있습니다. XSLT 1.0에서는 mimic copy-namespaces을 사용해야합니다.

+1

완벽한, 감사합니다! 당신 말이 맞아요, 나는 속성으로 이동하는 다른 필드가 필요하지 않습니다. 이 모든 것이 제 3 자 데이터 가져 오기에 사용되므로 그 점에 대해 감사드립니다! –

관련 문제