Существует несколько способов приблизиться к этому преобразованию в 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>
В этом простом примере второй подход, вероятно, самый простой, но я подозреваю, что первый подход лучше масштабируется для более сложных реальных случаев использования.