需要使用XSLT删除Json输出中的一些元素

时间:2016-12-13 10:39:10

标签: json xml xslt

我想删除一些元素并使用XSLT从xml输入中在Json的输出中交换一些元素

我的输入有效xml文件是:

         <items>
            <item>
               <statement/>
               <response/>
               <media>
                  <type>img</type>
                  <link>SLP.jpg</link>
               </media>
            </item>
            <item>
               <statement>walking time bomb.</statement>
               <response>
                  <p>Developing additional problems with your health.</p>
               </response>
               <media>
                  <type>html</type>
                  <link>Brightcove.com%2FZ678766-1.avi</link>
               </media>
            </item>
</items>

我用作的XSL:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:json="http://json.org/" exclude-result-prefixes="#all">

    <xsl:template match="items">
            items: [
            <xsl:apply-templates/>
            ]
        </xsl:template>

        <xsl:template match="item">
            {
            <xsl:apply-templates/>
            },
        </xsl:template>

        <xsl:template match="statement">
            "statement": "<xsl:apply-templates/>"
        </xsl:template>

        <xsl:template match="response">
            "response": "<xsl:apply-templates/>"
        </xsl:template>

        <xsl:template match="media">
            media: {
            <xsl:apply-templates/>
            }
        </xsl:template>

        <xsl:template match="type">
            "type": "<xsl:apply-templates/>"
        </xsl:template>

        <xsl:template match="link">
            <xsl:text>"link": "files/</xsl:text>
            <xsl:value-of select="tokenize(., '/')[last()]"/>"
        </xsl:template>

        <xsl:template match="p">
            <xsl:apply-templates/>
        </xsl:template>

</xsl:stylesheet>

我得到输出json为:

items: [

    {

    "statement": ""

    "response": ""

    media: {

    "type": "img"
    "link": "files/SLP.jpg"

    }

    },

    {

    "statement": "walking time bomb."

    "response": "Developing additional problems with your health."

    media: {

    "type": "html"
"link": "files/Brightcove.com%2FZ678766-1.avi"

    }

    },

但是我需要输出如下所示:

media: {

        "type": "img"
        "link": "files/SLP.jpg"

        }

        items: [

        {

        "statement": "walking time bomb."

        "response": "Developing additional problems with your health."

        media: {

        "type": "html"
    "link": "files/Brightcove.com%2FZ678766-1.avi"

        }

        },

我需要第一个媒体文件(jpg格式)在输出中单独出现,如上所述。请帮我解决这个问题。提前致谢

1 个答案:

答案 0 :(得分:2)

如果您希望第一个媒体文件单独出现,则可以通过更改与items

匹配的当前模板单独选择它
<xsl:template match="items">
    <xsl:apply-templates select="item[1]/media" />
    items: [
    <xsl:apply-templates select="item[position() &gt; 1]"/>
    ]
</xsl:template>

所有其他模板可以保持不变。