[英]dynamic xml generation using XSLT
我們有來自Source的傳入JSON數據,其中的數據和列位於相同的有效負載中。 在XSLT中使用json-to-xml,我可以生成XML,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
<boolean key="allData">true</boolean>
<map key="factMap">
<map key="T!T">
<array key="rows">
<map>
<array key="dataCells">
<map>
<string key="label">1A</string>
<string key="value">1A</string>
</map>
<map>
<string key="label">1B</string>
<string key="value">1B</string>
</map>
<map>
<string key="label">1C</string>
<string key="value">1C</string>
</map>
</array>
</map>
<map>
<array key="dataCells">
<map>
<string key="label">2A</string>
<string key="value">2A</string>
</map>
<map>
<string key="label">2B</string>
<string key="value">2B</string>
</map>
<map>
<string key="label">2C</string>
<string key="value">2C</string>
</map>
</array>
</map>
<map>
<array key="dataCells">
<map>
<string key="label">3A</string>
<string key="value">3A</string>
</map>
<map>
<string key="label">3B</string>
<string key="value">3B</string>
</map>
<map>
<string key="label">3C</string>
<string key="value">3C</string>
</map>
</array>
</map>
</array>
</map>
</map>
<map key="detailColumnInfo">
<map key="Product_vod__c.F1">
<string key="dataType">string</string>
<string key="label">F1</string>
</map>
<map key="Product_vod__c.F2">
<string key="dataType">string</string>
<string key="label">F2</string>
</map>
<map key="Product_vod__c.F3">
<string key="dataType">string</string>
<string key="label">F3</string>
</map>
</map>
</map>
在這里,每一行都可以在dataCells標簽下用作標簽和值。 dataCells下的值表示字段的值,但是標簽不表示字段名稱。 字段名稱和字段順序是detailColumnInfo標記的一部分。 字段/數據的順序和數量不固定,但是目標XML應保持固定。 例如,傳入數據可以具有10個字段,並且數據可以按任何順序排列,但是目標XML應該只有2個字段。 為了實現這一點,我相信在運行時,我們必須弄清楚F1字段的順序,並且必須從dataCells中選擇相應的數據。 例如,如果F1是field是detailColumnInfo中的第一個字段,那么我必須從所有dataCells(1A,2A,3A)中選擇第一個值,並生成具有F1字段值的目標XML,依此類推。
Detailcolumninfo標記表示列詳細信息。 值字段在Detailcolumninfo中的位置將確定字段在數據單元格中的位置。 對於查詢中發布的輸入代碼段,如果F1是Detailcolumninfo中的第一個標簽,則數據單元格(1A,2A,3A)中的第一個值表示F1的值。 類似地,1B,2B,3B表示F2的值。 目標XML應該如下所示:
<Root>
<Rows>
<Row>
<F1> 1A </F1>
<F2> 1B </F2>
<F3> 1C </F3>
</Row>
<Row>
<F1>2A </F1>
<F2> 2B </F2>
<F3> 2C </F3>
</Row>
<Row>
<F1>3A </F1>
<F2> 3B </F2>
<F3> 3C </F3>
</Row>
</Rows>
誰能建議實現這種動態映射的可能解決方案。
這是一個示例,假定您只是想將每個帶有key="dataCells"
array
元素映射到Row
元素,然后從detailColumnInfo中輸出帶有包裝在標簽中的key="value"
后代string
:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:math="http://www.w3.org/2005/xpath-functions/math"
exclude-result-prefixes="xs math fn"
expand-text="yes"
version="3.0">
<xsl:param name="json-xml">
<map xmlns="http://www.w3.org/2005/xpath-functions">
<boolean key="allData">true</boolean>
<map key="factMap">
<map key="T!T">
<array key="rows">
<map>
<array key="dataCells">
<map>
<string key="label">1A</string>
<string key="value">1A</string>
</map>
<map>
<string key="label">1B</string>
<string key="value">1B</string>
</map>
<map>
<string key="label">1C</string>
<string key="value">1C</string>
</map>
</array>
</map>
<map>
<array key="dataCells">
<map>
<string key="label">2A</string>
<string key="value">2A</string>
</map>
<map>
<string key="label">2B</string>
<string key="value">2B</string>
</map>
<map>
<string key="label">2C</string>
<string key="value">2C</string>
</map>
</array>
</map>
<map>
<array key="dataCells">
<map>
<string key="label">3A</string>
<string key="value">3A</string>
</map>
<map>
<string key="label">3B</string>
<string key="value">3B</string>
</map>
<map>
<string key="label">3C</string>
<string key="value">3C</string>
</map>
</array>
</map>
</array>
</map>
</map>
<map key="detailColumnInfo">
<map key="Product_vod__c.F1">
<string key="dataType">string</string>
<string key="label">F1</string>
</map>
<map key="Product_vod__c.F2">
<string key="dataType">string</string>
<string key="label">F2</string>
</map>
<map key="Product_vod__c.F3">
<string key="dataType">string</string>
<string key="label">F3</string>
</map>
</map>
</map>
</xsl:param>
<xsl:variable name="label-names" as="xs:string*" select="$json-xml//fn:map[@key = 'detailColumnInfo']/fn:map/fn:string[@key = 'label']/string()"/>
<xsl:output indent="yes"/>
<xsl:template match="/" name="xsl:initial-template">
<xsl:apply-templates select="$json-xml//fn:map[@key = 'factMap']"/>
</xsl:template>
<xsl:template match="fn:map[@key = 'factMap']">
<Root>
<Rows>
<xsl:apply-templates select="$json-xml//fn:array[@key = 'rows']/fn:map/fn:array"/>
</Rows>
</Root>
</xsl:template>
<xsl:template match="fn:array[@key = 'rows']/fn:map/fn:array">
<Row>
<xsl:apply-templates select="fn:map/fn:string[@key = 'value']"/>
</Row>
</xsl:template>
<xsl:template match="fn:string[@key = 'value']">
<xsl:element name="{let $pos := position() return $label-names[$pos]}">{.}</xsl:element>
</xsl:template>
</xsl:stylesheet>
輸出是
<Root>
<Rows>
<Row>
<F1>1A</F1>
<F2>1B</F2>
<F3>1C</F3>
</Row>
<Row>
<F1>2A</F1>
<F2>2B</F2>
<F3>2C</F3>
</Row>
<Row>
<F1>3A</F1>
<F2>3B</F2>
<F3>3C</F3>
</Row>
</Rows>
</Root>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.