如何在Oxygen中使用XSLT从单个XML文件中拆分为3个JSON

时间:2016-11-30 11:13:03

标签: css json xml xslt

我的输入XML具有页眉,内容和页脚部分。使用XSLT可以很好地从XML转换为JSON。但我需要输出作为标题,内容和页脚三个部分:

我的输入XML文件是:

<header>
  <trackingSettings>
    <urlcode>W3333</urlcode>
    <apiurl>http://mlucenter.com/like/api</apiurl>
  </trackingSettings>
</header>
<mlu3_body>
  <columnsCount>2</columnsCount>
  <lineBackground>linear-gradient(to right, rgba(94, 172, 192, 0) 0%, c4cccf 50%, rgba(94, 172, 192, 0) 100%)</lineBackground>
</mlu3_body>
<footer>
  <buttons>
    <button/>
  </buttons>
  <banner/>
</footer>

我的XSLT使用:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes" method="xml" />

        <xsl:template match="*">
            <xsl:value-of select="name()"/> : <xsl:call-template name="Properties"/>
        </xsl:template>

        <xsl:template match="*" mode="ArrayElement">
            <xsl:call-template name="Properties"/>
        </xsl:template>

        <xsl:template name="Properties">
            <xsl:variable name="childName" select="name(*[1])"/>
            <xsl:choose>
                <xsl:when test="not(*|@*)">"<xsl:value-of select="."/>"</xsl:when>
                <xsl:when test="count(*[name()=$childName]) > 1">{ "<xsl:value-of select="$childName"/>" :[<xsl:apply-templates select="*" mode="ArrayElement"/>] }</xsl:when>
                <xsl:otherwise>{
                    <xsl:apply-templates select="@*"/>
                    <xsl:apply-templates select="*"/>
                    }</xsl:otherwise>
            </xsl:choose>
            <xsl:if test="following-sibling::*">,</xsl:if>
        </xsl:template>

        <xsl:template match="@*">"<xsl:value-of select="name()"/>" : '<xsl:value-of select="."/>',
        </xsl:template>
</xsl:stylesheet>

这里我在氧气中使用Saxon PE:

我希望将此XML转换为输出中名为header.jsoncontent.json(mlu3_body)和footer.json的3个JSON文件。

这可以通过使用XSLT来实现,还是我想单独保留所有输入文件。请提供一些想法。

1 个答案:

答案 0 :(得分:0)

将XSLT更改为

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" />

        <xsl:template match="*">
            <xsl:value-of select="name()"/> : <xsl:call-template name="Properties"/>
        </xsl:template>

        <xsl:template match="*" mode="ArrayElement">
            <xsl:call-template name="Properties"/>
        </xsl:template>

        <xsl:template name="Properties">
            <xsl:variable name="childName" select="name(*[1])"/>
            <xsl:choose>
                <xsl:when test="not(*|@*)">"<xsl:value-of select="."/>"</xsl:when>
                <xsl:when test="count(*[name()=$childName]) > 1">{ "<xsl:value-of select="$childName"/>" :[<xsl:apply-templates select="*" mode="ArrayElement"/>] }</xsl:when>
                <xsl:otherwise>{
                    <xsl:apply-templates select="@*"/>
                    <xsl:apply-templates select="*"/>
                    }</xsl:otherwise>
            </xsl:choose>
            <xsl:if test="following-sibling::*">,</xsl:if>
        </xsl:template>

        <xsl:template match="@*">"<xsl:value-of select="name()"/>" : '<xsl:value-of select="."/>',
        </xsl:template>

        <xsl:template match="header">
           <xsl:result-document href="header.json">
             <xsl:next-match/>
           </xsl:result-document>
        </xsl:template>

        <xsl:template match="mlu3_body">
           <xsl:result-document href="content.json">
             <xsl:next-match/>
           </xsl:result-document>
        </xsl:template>

        <xsl:template match="footer">
           <xsl:result-document href="footer.json">
             <xsl:next-match/>
           </xsl:result-document>
        </xsl:template>


</xsl:stylesheet>

它应该为这三个元素生成三个结果文件。如果制作的内容还不是很正确的话,您将需要编辑您的问题并准确告诉我们您想要的结果。目前还不清楚你所展示的XML片段是否是更大文档的一部分。