2017-11-12 9 views
0

아니요. xml 및 나는 적절한 json 형식으로 XSLT 사용하여 변환해야합니다. 나는 배열을 제외한 모든 것을 변환 할 수있다. 템플릿을 일반으로 유지해야합니다. n 직원을 가진 m 부서를 가진 계정 -XSLT 배열을 반복하고 하위 요소 (Xml to Json)에 일반 템플릿을 적용하십시오.

Here는 시나리오를 가지고 요점 샘플 예 (XML, XSL 및 결과)이다.

XSL은 복잡한 개체를 포함한 모든 시나리오에서 잘 작동합니다. 그러나 배열에 이상적인 JSON 형식을 적용하지는 않습니다. 배열의 각 요소에 객체 이름을 추가합니다. 실제로는 매우 복잡한/중첩 된 xml을 가지고 있으므로 가능한 한 제네릭으로 xslt를 유지해야합니다.

다음 두 개의 템플릿을 추가하면 리프 노드 뒤에 쉼표가 추가되지 않습니다.

<xsl:template match="departments"> 
    <xsl:text>"departments": [{</xsl:text> 
    <xsl:for-each select=".//department"> 
     <xsl:if test="position() > 1"> 
      <xsl:text>},{</xsl:text> 
     </xsl:if> 
     <xsl:apply-templates /> 
    </xsl:for-each> 
    <xsl:text>}]</xsl:text> 
</xsl:template> 

<xsl:template match="employees"> 
    <xsl:text>"employees": [{</xsl:text> 
    <xsl:for-each select=".//employee"> 
     <xsl:if test="position() > 1"> 
      <xsl:text>},{</xsl:text> 
     </xsl:if> 
     <xsl:apply-templates /> 
    </xsl:for-each> 
    <xsl:text>}]</xsl:text> 
</xsl:template> 

본인도 expected-result.json을 요지로 복사했습니다. 배열의 하위 요소를 반복하고 템플릿을 중첩 된 객체 또는 다른 논리에 적용 할 수 있습니까?

+0

I은 ​​일반적으로 빠른 전환을 테스트 [W3 스쿨 (https://www.w3schools.com/xml/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog)를 사용한다. – GovindS

+0

적어도 배열을 처리해야하는 요소를 XSLT의 변수에 표시해야합니다. 그렇지 않으면 XSLT가 객체 대신 JSON 배열을 출력하는 것을 알 수있는 방법이 없습니다. TBH, 나는 XSLT가 XML을 JSON으로 변환하는 데 아주 좋은 선택이라고 생각하지 않는다. 유효한 JSON을 생성하는 데 필요한 모든 복잡한 이스케이프 규칙을 어떻게 처리 할 예정입니까? – JLRishe

+0

@JLRishe 예, 배열로 처리해야하는 요소를 지정해야합니다. 문제의 구현을 초안을 작성했습니다. 하지만 개선이 필요합니다. 맞춤 설정된 JSON을 만드는 방법에 대해 자세히 설명합니다. 배열로 취급해야하는 요소에 대해 알릴 필요가 있습니다. 다른 모든 것은 내가 공유 한 템플릿에 의해 처리됩니다. – GovindS

답변

0

array-obj 새 템플릿을 추가하고 employeesdepartments 필드가 일치하는 템플릿에서 호출하십시오.

<xsl:template name="array-obj"> 
    <xsl:text>{ 
</xsl:text> 
    <xsl:for-each select="*"> 
     <xsl:if test="position() > 1"> 
      <xsl:text>, 
</xsl:text> 
     </xsl:if> 
     <xsl:apply-templates select="."/> 
    </xsl:for-each> 
     <xsl:text> 
</xsl:text> 
    <xsl:text>}</xsl:text> 
</xsl:template> 

employeesdepartments 템플릿은 아래와 같이 수정 될 필요가있다. 템플리트에서 중괄호를 제거하십시오.

<xsl:template match="employees"> 
    <xsl:text>"employees": [</xsl:text> 
    <xsl:for-each select=".//employee"> 
     <xsl:if test="position() > 1"> 
      <xsl:text>,</xsl:text> 
     </xsl:if> 
     <xsl:call-template name="array-obj"/> 
    </xsl:for-each> 
    <xsl:text>]</xsl:text> 
</xsl:template>