JSON до XML разговоры с использованием XSLT 3.0 - PullRequest
0 голосов
/ 08 апреля 2020

Я использую Windows и SAXON 9,9 (HE) .

My JSON Код:

{"analystId": "Test","jobId": "","profileData":{"allAuthorCoverage": false,"abc":"xyz","assetClasses":[{"status": "Test1"}]}}

МОЙ XSLT-код:

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" /> 
<xsl:strip-space elements="*"/>
<xsl:param name="input" select="'simple3.json'"/>
<xsl:template match="@*|node()"> 
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template> 
<xsl:template name="init">
<xsl:apply-templates select="json-to-xml(unparsed-text($input))" mode="copy"/>
</xsl:template>
<xsl:template match="node() | @*" mode="copy">
<xsl:copy>
<xsl:apply-templates select="node() | @*" mode="copy"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

Мой требуемый вывод XML:

<root>
<analystId>Test</analystId>
<jobId></jobId>
<profileData>
<allAuthorCoverage>false</allAuthorCoverage>
<abc>xyz</abc>
</profileData>
</root>

Как этого добиться?

1 Ответ

2 голосов
/ 08 апреля 2020

Существует несколько способов приблизиться к этому преобразованию в XSLT 3.0.

Один из способов - использовать json-to-xml(), а затем преобразовать полученный XML. Результирующий XML равен

<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
   <string key="analystId">Test</string>
   <string key="jobId"/>
   <map key="profileData">
      <boolean key="allAuthorCoverage">false</boolean>
      <string key="abc">xyz</string>
      <array key="assetClasses">
         <map>
            <string key="status">Test1</string>
         </map>
      </array>
   </map>
</map> 

, и вы можете преобразовать его либо с помощью общих c правил, таких как

<xsl:template match="*[@key]">
  <xsl:element name="{@key}">
    <xsl:apply-templates/>
  </xsl:element>
</xsl:template>

, либо с указанными c правилами, такими как:

<xsl:template match="fn:string[@key='analystId']>
  <analystId>{.}</analystId>
</xsl:template>

или с некоторой комбинацией двух.

Второй способ сделать это - написать шаблон для желаемого результата XML, а затем погрузиться в разобранный JSON, чтобы извлечь указанные c значений, где необходимо:

<xsl:template name="xsl:initial-template">
  <xsl:variable name="json" select="parse-json(....)"/>
  <root>
    <analystId>{$json?analystId}</analystId>
    <jobId>{$json?jobId}</jobId>
    <profileData>
      <allAuthorCoverage>{$json?profileData?allAuthorCoverage}</allAuthorCoverage>
      <abc>{$json?profileData?abc}</abc>
    </profileData>
  </root>
</xsl:template>

В этом простом примере второй подход, вероятно, самый простой, но я подозреваю, что первый подход лучше масштабируется для более сложных реальных случаев использования.

...