删除xml中的父元素,同时使用xslt保留它的子元素

时间:2016-03-23 23:52:09

标签: xml xslt xslt-1.0 xslt-2.0

我想转换以下xml,

CREATE TABLE MovieGenre (
    movieId INT,
    genreId INT,
    UNIQUE KEY (movieId, genreId),
    FOREIGN KEY (movieId) REFERENCES Movies (id),
    FOREIGN KEY (genreId) REFERENCES Genres (id)
)

以此xml格式。

<pets>
    <Pet>
        <category>
            <id>4</id>
            <name>Lions</name>
        </category>
        <id>9</id>
        <name>Lion 3</name>
        <photoUrls>
            <photoUrl>url1</photoUrl>
            <photoUrl>url2</photoUrl>
        </photoUrls>
        <status>available</status>
        <tags>
            <tag>
                <id>1</id>
                <name>tag3</name>
            </tag>
            <tag>
                <id>2</id>
                <name>tag4</name>
            </tag>
        </tags>
    </Pet>
</pets>

我尝试按如下方式编写模板,但它会删除带有子元素的父元素。

<pets>
    <Pet>
        <category>
            <id>4</id>
            <name>Lions</name>
        </category>
        <id>9</id>
        <name>Lion 3</name>
        <photoUrl>url1</photoUrl>
        <photoUrl>url2</photoUrl>
        <status>available</status>
        <tag>
            <id>1</id>
            <name>tag3</name>
        </tag>
        <tag>
            <id>2</id>
            <name>tag4</name>
        </tag>
    </Pet>
</pets>

如何在xslt中完成此操作。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:3)

我会这样做:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes" method="xml" />

    <xsl:template match="photoUrls|tags">
       <!-- Apply identity transform on child elements of photoUrls/tags-->
        <xsl:apply-templates select="*"/>
    </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:2)

以下xslt完成了这项工作,

mockFoo = EasyMock.createMock(Foo.class);
EasyMock.expect(mockFoo.someMethod()).times(n).andReturn(someValue);
// then run test

但如果你有其他方法可以这样做,请不要犹豫,在这里发布你的答案。

答案 2 :(得分:0)

您也可以使用此代码。

<?xml version="1.0" encoding="UTF-8" ?><xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml"/>

<xsl:template match="photoUrls|tags">
    <xsl:copy-of select="node()"/>
</xsl:template>
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
</xsl:transform>