我正在从源XML将XSLT转换为JSON。我希望将数组类型元素转换为“elements:[]”
从给定的xslt我匹配节点名称并应用模板。但是如何为每个数组类型元素动态地执行此操作,或者我可以选择在JSON中将哪个元素转换为数组类型元素。
这是我的源XML
<order>
<email>mark.h@yopmail.com</email>
<tax-lines>
<tax-line>
<title>CGST</title>
<price>29.00</price>
<rate>0.2</rate>
</tax-line>
</tax-lines>
<freight-Lines>
<freight-Line>
<title>CGST</title>
<price>29.00</price>
<rate>0.2</rate>
</freight-Line>
</freight-Lines>
</order>
XSLT:
<xsl:when test="name()= 'tax-lines'">
[<xsl:apply-templates select="*" mode="ArrayElement"/>]
</xsl:when>
使用这个我输出Json为:
{
"order" :
{
"email" :"mark.h@yopmail.com",
"tax-lines" :
[
{
"title" :"CGST",
"price" :"29.00",
"rate" :"0.2"
}
]
}
}
无论如何,我可以动态地在'货运线'数组上做同样的事情吗?意味着我想动态地做这一行
<xsl:when test="name()= 'tax-lines'">
[<xsl:apply-templates select="*" mode="ArrayElement"/>]
</xsl:when>
答案 0 :(得分:2)
解决这个问题的一种方法是使用某种映射模式控制转换。所以你可能有:
由此您可以生成包含一组模板规则的样式表,例如:
<xsl:template match="tax-lines | freight-lines">
<xsl:text>[</xsl:text>
<xsl:for-each select="*">
<xsl:if test="position() != 1">,</xsl:if>
<xsl:apply-templates select="."/>
<xsl:text>]</xsl:text>
</xsl:template>
<xsl:template match="tax-line | freight-line">
<xsl:text>{</xsl:text>
<xsl:for-each select="*">
<xsl:if test="position() != 1">,</xsl:if>
<xsl:text>"</xsl:text>
<xsl:value-of select="local-name()"/>
<xsl:text>":</xsl:text>
<xsl:apply-templates select="."/>
<xsl:text>}</xsl:text>
</xsl:template>
<xsl:template match="*[. castable as xs:double]">
<xsl:value-of select="."/>
</xsl:template>
<xsl:template match="*">
<xsl:text>"</xsl:text>
<xsl:value-of select="."/>
<xsl:text>"</xsl:text>
</xsl:template>
所以你基本上有一组模式用于将不同的XML元素映射到JSON,每个模板都有一个框架模板规则;您的映射架构定义了源文档中每个元素使用的模式(使用默认值),然后将映射架构转换为将每个元素名称与相应模板规则相关联的样式表。