2017-10-01 10 views
0

감사합니다. 많은 제안과 답변에 stackoverflow 감사드립니다. 아래 xslt를 사용하여 rootnode에서 속성 값을 정렬하는 데 도움이 필요합니다.

이 소스 XML이 가지고
<?xml version="1.0" encoding="UTF-8"?> 
<PurchaseOrderDocument creationDate="2017-09-26T18:37:48.837Z" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
     xmlns:dssuid="urn:autoid:specification:universal:Identifier:xml:schema:1" 
     xmlns:dsscore="urn:autoid:specification:interchange:PMLCore:xml:schema:1"> 
    <PurchaseQuery> 
     <EventDate>20170926</EventDate> 
     <bizLocation> 
      <id>urn:ddd:id:sgln:0315563.00000.0</id> 
     </bizLocation> 
     <Serialization> 
      <BATCH_ID>3091145AB</BATCH_ID> 
      <EXPIRATION_DATE>20190504</EXPIRATION_DATE> 
      <PRODUCTION_DATE>20170505</PRODUCTION_DATE> 
      <GTIN>04028691544401</GTIN> 
      <Count>8088</Count> 
     </Serialization> 
    </PurchaseQuery> 
</PurchaseOrderDocument> 

내 실제 목표는 내가 아래 XSLT를 적용하려고

<?xml version="1.0" encoding="UTF-8"?> 
<ns0:PurchaseOrderDocument xmlns:ns0="urn:global:mns:PurchaseOrder" 
          creationDate="2017-09-26T18:37:48.837Z"> 
    <PurchaseQuery> 
    <EventDate>20170926</EventDate> 
    <bizLocation> 
     <id>urn:ddd:id:sgln:0315563.00000.0</id> 
    </bizLocation> 
    <Serialization> 
     <BATCH_ID>3091145AB</BATCH_ID> 
     <EXPIRATION_DATE>20190504</EXPIRATION_DATE> 
     <PRODUCTION_DATE>20170505</PRODUCTION_DATE> 
     <GTIN>04028691544401</GTIN> 
     <Count>8088</Count> 
    </Serialization> 
    </PurchaseQuery> 
</ns0:PurchaseOrderDocument> 

아래처럼 보일 것입니다 원치 않는 네임 스페이스를 가지고 내 소스 코드이지만, 속성은 아닌 타겟이 기대하는 순서

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

    <xsl:template match="@*|node()"> 

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

    <xsl:template match="*" priority="1"> 

     <xsl:element name="{local-name()}" > 
      <xsl:namespace name="ns0" 
          select="'urn:global:mns:PurchaseOrder'"/> 
      <xsl:apply-templates select="@*|node()"/> 

     </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

T 그는 XSLT를 적용 후 출력

<?xml version='1.0' encoding='UTF-8' ?> 
<PurchaseOrderDocument xmlns:ns0="urn:global:mns:PurchaseOrder" 
         creationDate="2017-09-26T18:37:48.837Z"> 
    <PurchaseQuery> 
    <EventDate>20170926</EventDate> 
    <bizLocation> 
     <id>urn:ddd:id:sgln:0315563.00000.0</id> 
    </bizLocation> 
    <Serialization> 
     <BATCH_ID>3091145AB</BATCH_ID> 
     <EXPIRATION_DATE>20190504</EXPIRATION_DATE> 
     <PRODUCTION_DATE>20170505</PRODUCTION_DATE> 
     <GTIN>04028691544401</GTIN> 
     <Count>8088</Count> 
    </Serialization> 
    </PurchaseQuery> 
</PurchaseOrderDocument> 

아래 내가 네임 스페이스 전에 작성 날짜 속성 얻기 위해 여러 가지 방법을 시도하지만이 실종이 많은 블로그를 보았다 어딘지 이해 .I이 할 수없는 나는 헛되이 갔지만 같다 나는 불행하게도 대상 구조에서 올바른 위치에 올 루트 노드의 특성 (동적 값)을 유지하는 방법을 찾을 수 없습니다.이 논리는 나에게 중요합니다 .XSLT 코드에 무엇을 포함시켜야하는지 제안하십시오. 실제 목표물 구조를 얻으려면. 모든 도움이 크게 감사 할 것입니다.

답변

1

직렬화 된 XML의 특성 순서 (이 경우 이름 공간 선언은 특성으로 간주됩니다)는 중요하지 않은 것으로 간주되며 XSLT를 사용하여 제어 할 수 없습니다. 내가 아는 다른 대부분의 직렬화 라이브러리에서도 마찬가지입니다.

Saxon은 네임 스페이스가 아닌 특성의 순서를 제어하는 ​​확장명 (xsl : output/@ saxon : attribute-order)을 가지고 있지만 네임 스페이스 선언이 특성과 관련하여 나타나는 위치에는 영향을 미치지 않습니다.

나는이 문제가 왜 그렇게 중요한지 물어야합니다. 만약 당신이 conformant parser를 사용하여 XML을 읽는다면, 속성들이 어떤 순서로 나타나는지 신경 쓰지 않을 것입니다. 그리고 당신이 conformant parser를 사용하지 않고 XML을 읽고 있다면 당신은 나쁜 실수를 저지르고 있습니다.

And also please help me how I can add prefix ns0: for each target line. 

그건 또 다른 문제입니다. 하지만 "접두사를 어떻게 추가 할 수 있습니까?"라고 생각하면 안됩니다. "내 출력 요소를 네임 스페이스 urn:global:mns:PurchaseOrder에 어떻게 집어 넣을 수 있습니까?"라고 생각해야합니다. 음, 출력 요소를 만드는 세 가지 방법은 다음과 같습니다

  • xsl:copy

    항상 원본과 같은 이름 (네임 스페이스 URI 플러스 로컬 이름)와 요소를 만드는 것, 그래서 여기가 적합하지 않습니다.

  • 리터럴 결과 요소는 동일한 이름 (이름 공간 URI 플러스 로컬 이름)를 갖는 요소를 생성 스타일 시트 내의 명령 등

  • xsl:element는 두 부분을 제어 할 수있는 두 가지 특성, 이름 공간을 가지고 출력 요소 이름의.

+0

위의 경우에 대한 XSLT 코드가 있습니까? 저에게 알려주세요. Anyhelp는 크게 감사하겠습니다. – piuser

+0

네임 스페이스 특성을 xsl : element 명령에 추가합니다 (네임 스페이스 URI로 설정). xsl : namespace 명령을 h 제하십시오. –