2017-12-22 23 views
0

xml을 가지고 xslt를 사용하여 json으로 출력하고 싶습니다. 나는 그 중 solution을 찾았지만 xslt에서 새로 왔기 때문에 내가 할 수없는 몇 가지 변화가 필요하다. 이 솔루션에서 json의 목록으로 일부 중첩 된 태그를 원하지만이 솔루션은 xml의 모든 중첩 된 태그를 json의 목록으로 제공하지만 원하는 것은 없습니다. 요점은 여분의 []를 제거하고 싶습니다. xslt에서 특정 노드를 목록으로 만드는 방법 및 json에서 출력을 원합니다.

내 XML은

<?xml version="1.0" encoding="UTF-8"?><User> 
<MaritalStatus>Single</MaritalStatus> 
<Name> 
    <FirstName>abc</FirstName> 
    <MiddleName>def</MiddleName> 
    <LastName>ghi</LastName> 
</Name> 
<Relative> 
    <Father> 
     <Name> 
      <FirstName>abc</FirstName> 
      <MiddleName>def</MiddleName> 
      <LastName>ghi</LastName> 
     </Name> 
    </Father> 
    <Mother> 
     <Name> 
      <FirstName>abc</FirstName> 
      <MiddleName>def</MiddleName> 
      <LastName>ghi</LastName> 
     </Name> 
    </Mother> 
    <Sibling> 
     <Name> 
      <FirstName>abc</FirstName> 
      <MiddleName>def</MiddleName> 
      <LastName>ghi</LastName> 
     </Name> 

    </Sibling> 
</Relative> 
<Friend> 
    <Name> 
     <FirstName>abc</FirstName> 
     <MiddleName>def</MiddleName> 
     <LastName>ghi</LastName> 
    </Name> 
</Friend></User> 

내가 JSON

[{ 
"MaritalStatus": "Single", 
"Name": [ 
    { 
    "FirstName": "abc", 
    "MiddleName": "def", 
    "LastName": "ghi" 
    } 
], 
"Relative": [ 
    { 
    "Father": [ 
     { 
     "Name": [ 
      { 
      "FirstName": "abc", 
      "MiddleName": "def", 
      "LastName": "ghi" 
      } 
     ] 
     } 
    ], 
    "Mother": [ 
     { 
     "Name": [ 
      { 
      "FirstName": "abc", 
      "MiddleName": "def", 
      "LastName": "ghi" 
      } 
     ] 
     } 
    ], 
    "Sibling": [ 
     { 
     "Name": [ 
      { 
      "FirstName": "ewqrew", 
      "MiddleName": "defasdfadsf", 
      "LastName": "ghiqwerwqer" 
      } 
     ] 
     } 
    ] 
    } 
], 
"Friend": [ 
    { 
    "Name": [ 
     { 
     "FirstName": "asd", 
     "MiddleName": "ghd", 
     "LastName": "rtu" 
     } 
    ] 
    } 
]}] 

하지만 내가 원하는 출력으로

{ 
"MaritalStatus": "Single", 
"Name": 
    { 
    "FirstName": "abc", 
    "MiddleName": "def", 
    "LastName": "ghi" 
    }, 
"Relative": [ 
    { 
    "Father": 
     { 
     "Name": 
      { 
      "FirstName": "abc", 
      "MiddleName": "def", 
      "LastName": "ghi" 
      } 
     }, 
    "Mother": 
     { 
     "Name": 
      { 
      "FirstName": "abc", 
      "MiddleName": "def", 
      "LastName": "ghi" 
      } 
     }, 
    "Sibling": [ 
     { 
     "Name": 
      { 
      "FirstName": "ewqrew", 
      "MiddleName": "defasdfadsf", 
      "LastName": "ghiqwerwqer" 
      } 
     } 
    ] 
    } 
], 
"Friend": [ 
    { 
    "Name": 
     { 
     "FirstName": "asd", 
     "MiddleName": "ghd", 
     "LastName": "rtu" 
     } 
    } 
]} 
+0

XSLT를 사용하면서 자신의 XSLT를 제출하십시오. 다른 질문/해결책을 가리켜도 도움이되지 않습니다. –

+0

나는 해결책을 시도했다 [https://stackoverflow.com/questions/30450607/remove-root-tag-in-json-using-xslt-when-conversion-xml-to-json?answertab=active#comment49099770_30456220] 이 링크의 하지만 나는 위에 언급 된 출력을 – Salman

답변

0

입니다 날을주고있다 언급 내게주는 솔루션입니다 제발 도와 색슨 홈 XPath 3.1 함수 fn:xml-to-json을 활용할 수 있습니다. . 내가 이해할 수있는 매우 간단한 해결책을 포함 할 것입니다.

다운로드 Saxon 홈을 다운로드하고 아래 xslt (test.xsl)을 만듭니다.

java -jar Saxon-HE-9.7.0-7.jar -s:<your-xml-file> -xsl:test.xsl 

이 (다운로드 한 버전으로 색슨 jar 파일 이름 바꾸기)

test.xsl

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/xpath-functions"> 
    <xsl:output method="text" encoding="UTF-8" indent="yes" /> 

    <!-- Naive approach --> 
    <xsl:template match="/"> 
     <xsl:variable name="xmljson"> 
      <xsl:apply-templates /> 
     </xsl:variable> 
     <xsl:value-of select="fn:xml-to-json($xmljson)" /> 
    </xsl:template> 

    <xsl:template match="User"> 
     <fn:map> 
      <xsl:apply-templates /> 
     </fn:map> 
    </xsl:template> 

    <xsl:template match="MaritalStatus"> 
     <fn:string key="MaritalStatus"> 
      <xsl:value-of select="." /> 
     </fn:string> 
    </xsl:template> 

    <xsl:template match="Name"> 
     <fn:map key="Name"> 
      <xsl:apply-templates /> 
     </fn:map> 
    </xsl:template> 

    <xsl:template match="FirstName"> 
     <fn:string key="FirstName"> 
      <xsl:value-of select="." /> 
     </fn:string> 
    </xsl:template> 

    <!-- TODO (naive approach)--> 
    <xsl:template match="Relative" /> 
    <xsl:template match="Friend" /> 
    <xsl:template match="MiddleName" /> 
    <xsl:template match="LastName" /> 

    <!-- TODO better way: fiddle with copy local-name() and more --> 

</xsl:stylesheet> 

Read about fn:xml-to-json

행운을 실행!

+0

에두고 싶습니다. 어떤 솔루션이나 지침을 사용자 정의합니까? – Salman

+0

"제네릭 솔루션"이 무슨 뜻인지 이해하지 못했을 것입니다. 'fn : xml-to-json '은 일반적입니다. 초기 질문과 XML 샘플을 감안할 때 복잡한 일반 스타일 시트가 필요하지 않습니다. "약간의 라이너"가 정상적으로 작동합니다. 임의의 복합 XML (특성, 데이터 형식, 주석, ...) 입력을 JSON으로 변환하는 XSLT 스타일 시트를 원하십니까? 나는 이것이 존재하는지 또는 그것이 가능한지/의미가 있는지 (결코 검색되지 않으며 이것에 대해 결코 생각하지 않음)인지 알지 못한다. 아마도 [http://www.jsonml.org/]와 같은 것이 필요할 것입니다. 귀하의 모든 요구와 기술을 반영하여 질문을 자세히 기재하십시오. 그것은 당신을 돕는 데 도움이됩니다. – Stefan