JSON 到 XSLT:默认 XML 节点如果 JSON 元素不存在
JSON to XSLT : default XML node if JSON element does NOT exist
我的 json 结构如下:
{
"Message" :
{
"dynamicFields" :
[ {
"alias" : "TEST_ALIAS",
"value" : "VALUE"
}
,
{
"alias" : "CAR",
"value" : "TOYOTA"
}
]
}
}
我有一个 xslt 样式表设置如下:
<xsl:template match="j:map[j:string[@key='value' and text() !='']]">
<xsl:if test="j:string[@key='alias' and text() != '']">
<ns2:field name="{j:string[@key='alias']}">
<xsl:value-of select="upper-case(j:string[@key='value'])"/>
</ns2:field>
</xsl:if>
</xsl:template>
创建如下元素:
<ns2:field name="TEST_ALIAS">VALUE</ns2:field>
但我不知道如何有条件地添加 xml 个节点
例如,如果不存在别名为 CAR
的 JSON 元素,则添加一个默认值
所以基本上,如果 JSON 看起来像:
{
"Message" :
{
"dynamicFields" :
[ {
"alias" : "TEST_ALIAS",
"value" : "VALUE"
}
]
}
}
xml 看起来像:
<ns2:field name="TEST_ALIAS">VALUE</ns2:field>
<ns2:field name="CAR">DEFAULT_CAR_VALUE</ns2:field>
关于 JSON 我能做的唯一假设是会有元素同时具有 alias
键和 value
键
在没有看到完整的 XSLT 的情况下,我进行了一些猜测,但我认为您可以添加(或修改)dynamicFields
属性 的模板并在其中添加测试数组是否包含 alias
为“CAR”的对象,如果不包含,则添加默认的 <ns2:field name="CAR"> DEFAULT_CAR_VALUE</ns2:field>
元素:
<xsl:template match="j:array[@key='dynamicFields']">
<xsl:apply-templates />
<xsl:variable name="default-field" select="'CAR'"/>
<xsl:if test="not(j:map/j:string[@key='alias'] = $default-field)">
<ns2:field name="{$default-field}">
<xsl:text>DEFAULT_CAR_VALUE</xsl:text>
</ns2:field>
</xsl:if>
</xsl:template>
<xsl:template match="j:map[j:string[@key='value' and text() !='']]">
<xsl:if test="j:string[@key='alias' and text() != '']">
<ns2:field name="{j:string[@key='alias']}">
<xsl:value-of select="upper-case(j:string[@key='value'])"/>
</ns2:field>
</xsl:if>
</xsl:template>
我的 json 结构如下:
{
"Message" :
{
"dynamicFields" :
[ {
"alias" : "TEST_ALIAS",
"value" : "VALUE"
}
,
{
"alias" : "CAR",
"value" : "TOYOTA"
}
]
}
}
我有一个 xslt 样式表设置如下:
<xsl:template match="j:map[j:string[@key='value' and text() !='']]">
<xsl:if test="j:string[@key='alias' and text() != '']">
<ns2:field name="{j:string[@key='alias']}">
<xsl:value-of select="upper-case(j:string[@key='value'])"/>
</ns2:field>
</xsl:if>
</xsl:template>
创建如下元素:
<ns2:field name="TEST_ALIAS">VALUE</ns2:field>
但我不知道如何有条件地添加 xml 个节点
例如,如果不存在别名为 CAR
的 JSON 元素,则添加一个默认值
所以基本上,如果 JSON 看起来像:
{
"Message" :
{
"dynamicFields" :
[ {
"alias" : "TEST_ALIAS",
"value" : "VALUE"
}
]
}
}
xml 看起来像:
<ns2:field name="TEST_ALIAS">VALUE</ns2:field>
<ns2:field name="CAR">DEFAULT_CAR_VALUE</ns2:field>
关于 JSON 我能做的唯一假设是会有元素同时具有 alias
键和 value
键
在没有看到完整的 XSLT 的情况下,我进行了一些猜测,但我认为您可以添加(或修改)dynamicFields
属性 的模板并在其中添加测试数组是否包含 alias
为“CAR”的对象,如果不包含,则添加默认的 <ns2:field name="CAR"> DEFAULT_CAR_VALUE</ns2:field>
元素:
<xsl:template match="j:array[@key='dynamicFields']">
<xsl:apply-templates />
<xsl:variable name="default-field" select="'CAR'"/>
<xsl:if test="not(j:map/j:string[@key='alias'] = $default-field)">
<ns2:field name="{$default-field}">
<xsl:text>DEFAULT_CAR_VALUE</xsl:text>
</ns2:field>
</xsl:if>
</xsl:template>
<xsl:template match="j:map[j:string[@key='value' and text() !='']]">
<xsl:if test="j:string[@key='alias' and text() != '']">
<ns2:field name="{j:string[@key='alias']}">
<xsl:value-of select="upper-case(j:string[@key='value'])"/>
</ns2:field>
</xsl:if>
</xsl:template>