删除给定节点上的XML内容并重新排列输出文件格式

时间:2011-10-24 19:56:14

标签: java xslt

[XSLT stylesheet]

在下面的示例中,

<tag1>
    <tag2>
        ...
            <generatoritem id="name1">
                <tag5>
                ...
                    <tag6>
                        <name>Center</name>
                        <keyframe>
                            <when>frame1</when>
                            <value>
                                <horiz>100</horiz>
                                <vert>100</vert>
                            </value>
                        </keyframe>
                        <keyframe>
                            <when>frame2</when>
                            <value>
                                <horiz>150</horiz>
                                <vert>150</vert>
                            </value>
                        </keyframe>
                    </tag6>
                </tag5>
            </generatoritem>
            <generatoritem id="name2">
                <tag7>
                ...
                    <tag8>
                        <name>Center</name>
                        <keyframe>
                            <when>frame3</when>
                            <value>
                                <horiz>100</horiz>
                                <vert>100</vert>
                            </value>
                        </keyframe>
                        <keyframe>
                            <when>frame4</when>
                            <value>
                                <horiz>150</horiz>
                                <vert>150</vert>
                            </value>
                        </keyframe>
                    </tag8>
                </tag7>
            </generatoritem>
    </tag2>
</tag1>

消除了过多的节点,我们试图获得以下输出格式:

id='name1'
    instance='frame1'
        horiz='100'
        vert='100'
    instance='frame2'
        horiz='150'
        vert='150'

id='name2'
    instance='frame3'
        horiz='200'
        vert='200'
    instance='frame4'
        horiz='250'
        vert='250'  

因此,基于多个id值,我们处理特定节点。必须消除标签,并保留关键信息。

请指教。谢谢!

1 个答案:

答案 0 :(得分:1)

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
                                    xmlns:exslt="http://exslt.org/common">
    <!-- disable xml output -->
    <xsl:output method="text"/>

    <xsl:variable name="toprocess">
    <data>
        <node>name1</node>
        <node>name3</node> <!-- and other nodes you want to process -->
    </data>
    </xsl:variable>

    <xsl:template match="/">
        <xsl:apply-templates select=".//generatoritem[ @id = exslt:node-set($toprocess)/data/node]"/>
    </xsl:template>

    <xsl:template match="generatoritem">
    id=<xsl:value-of select="@id"/>
    <xsl:apply-templates select=".//keyframe"/>
    <!-- just for the new line -->
    <xsl:text>
    </xsl:text>
    </xsl:template>

    <xsl:template match="keyframe">
         instance='<xsl:value-of select="when"/>'
                 horiz='<xsl:value-of select="value/horiz"/>'
                 vert='<xsl:value-of select="value/vert"/>
    </xsl:template>

    </xsl:stylesheet>

应该作为输出

xsltproc data.xsl data.xml

id='name1'
   instance='frame1'
       horiz='100'
       vert='100'
   instance='frame2'
       horiz='150'
       vert='150'