2017-11-12 11 views
0

私は何も得られません。私はXSLTを使って適切なJSON形式に変換しなければなりません。私は配列を除いてすべてを変換することができます。私はテンプレートを汎用的に保つ必要があります。 n従業員を有するm部門を有するアカウント -XSLT配列を反復し、サブ要素に汎用テンプレートを適用する(Xml to Json)

Hereのようなシナリオを有する要旨試料例(XML、XSLおよび結果)です。

XSLは、複雑なオブジェクトを含むすべてのシナリオで正常に動作します。しかし、理想的なJSONフォーマットを配列に適用することはできません。配列の各要素にオブジェクト名を追加します。実際には、非常に複雑な/ネストされたxmlを持っているので、xsltを可能な限り一般的なままにしなければなりません。

次の2つのテンプレートを追加すると、リーフノードの後に​​コンマが追加されません。

<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> 

私はgistにexpected-result.jsonもコピーしました。配列の下位要素を反復処理し、ネストされたオブジェクトまたは他のロジックにテンプレートを適用する方法はありますか?

+0

Iは、一般的に迅速な変換をテストするための[W3Schoolsの(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> 
関連する問題