Первое преобразование с <xsl:sequence select="json-to-xml($json)"/>
отображается в https://xsltfiddle.liberty -development.net / bnnZWD / 5 и дает XML
<array xmlns="http://www.w3.org/2005/xpath-functions">
<map>
<string key="ID">DWL</string>
<array key="profiles">
<map>
<string key="firstName">Contact</string>
<string key="lastName">Sample</string>
<array key="emailAddresses">
<map>
<string key="emailAddress">inactive@mailinator.com</string>
</map>
</array>
</map>
</array>
</map>
<map>
<string key="ID">DWLK</string>
<array key="profiles">
<map>
<string key="firstName">Contact</string>
<string key="lastName">Sample</string>
<array key="emailAddresses">
<map>
<string key="emailAddress">sampltest@mailinator.com</string>
<boolean key="primary">true</boolean>
</map>
</array>
</map>
</array>
</map>
</array>
если вы используете это в качестве промежуточного результата и проталкиваете его через некоторые шаблоны (https://xsltfiddle.liberty -development.net / bnnZWD / 6 )
<xsl:template match="/" name="xsl:initial-template">
<xsl:variable name="json-xml" select="json-to-xml($json)"/>
<xsl:apply-templates select="$json-xml/node()"/>
</xsl:template>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="string[@key = 'ID']">
<xsl:next-match/>
<string key="origin">static</string>
</xsl:template>
<xsl:template match="string[@key = 'lastName']"/>
за изменение, которое вы хотите получить:
<array xmlns="http://www.w3.org/2005/xpath-functions">
<map>
<string key="ID">DWL</string>
<string key="origin">static</string>
<array key="profiles">
<map>
<string key="firstName">Contact</string>
<array key="emailAddresses">
<map>
<string key="emailAddress">inactive@mailinator.com</string>
</map>
</array>
</map>
</array>
</map>
<map>
<string key="ID">DWLK</string>
<string key="origin">static</string>
<array key="profiles">
<map>
<string key="firstName">Contact</string>
<array key="emailAddresses">
<map>
<string key="emailAddress">sampltest@mailinator.com</string>
<boolean key="primary">true</boolean>
</map>
</array>
</map>
</array>
</map>
</array>
Затем вы можете преобразовать преобразованный XML обратно в JSON, используя xml-to-json
: (https://xsltfiddle.liberty -development.net / bnnZWD / 7 )
<xsl:output method="text"/>
<xsl:template match="/" name="xsl:initial-template">
<xsl:variable name="json-xml" select="json-to-xml($json)"/>
<xsl:variable name="transformed-json-xml">
<xsl:apply-templates select="$json-xml/node()"/>
</xsl:variable>
<xsl:value-of select="xml-to-json($transformed-json-xml, map { 'indent' : true() })"/>
</xsl:template>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="string[@key = 'ID']">
<xsl:next-match/>
<string key="origin">static</string>
</xsl:template>
<xsl:template match="string[@key = 'lastName']"/>
и получить с саксонской 9.8 вывод
[
{ "ID" : "DWL",
"origin" : "static",
"profiles" :
[
{ "firstName" : "Contact",
"emailAddresses" :
[
{ "emailAddress" : "inactive@mailinator.com" } ] } ] },
{ "ID" : "DWLK",
"origin" : "static",
"profiles" :
[
{ "firstName" : "Contact",
"emailAddresses" :
[
{ "emailAddress" : "sampltest@mailinator.com",
"primary" : true } ] } ] } ]
Очистка промежуточных шагов, код может быть сокращен до
<xsl:output method="text"/>
<xsl:template match="/" name="xsl:initial-template">
<xsl:variable name="transformed-json-xml">
<xsl:apply-templates select="json-to-xml($json)/node()"/>
</xsl:variable>
<xsl:value-of select="xml-to-json($transformed-json-xml, map { 'indent' : true() })"/>
</xsl:template>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="string[@key = 'ID']">
<xsl:next-match/>
<string key="origin">static</string>
</xsl:template>
<xsl:template match="string[@key = 'lastName']"/>
https://xsltfiddle.liberty -development.net / bnnZWD / 9
И, конечно, вместо использования параметра с содержимым строки JSON вы можете использовать unparsed-text
для загрузки из файла JSON, например. <xsl:param name="json" select="unparsed-text('file.json')"/>
.