使用xslt将xml数组转换为另一种类型的xml数组

时间:2017-12-14 17:18:41

标签: arrays xml xslt groovy

我有两个xml文件。两者都是

的数组
  

人(下面有很多节点)

我需要转换这个

    <result>
        <sfobject>
            <id></id>
            <type>CompoundEmployee</type>
            <person>
                <lot of nodes/>
            </person>
        </sfobject>
        <sfobject>
            <id></id>
            <type>CompoundEmployee</type>
            <person>
                 <lot of nodes/>
            </person>
        </sfobject>
    </result>

    <queryCompoundEmployeeResponse>
        <CompoundEmployee>
            <id></id>
            <person>
                <lot of nodes/>
            </person>
        </CompoundEmployee>
        <CompoundEmployee>
            <id></id>
            <person>
              <lot of nodes/>
            </person>
        </CompoundEmployee>
    </queryCompoundEmployeeResponse>

使用xslt。我有这个xslt。

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output omit-xml-declaration="yes" indent="yes" />
        <xsl:strip-space elements="*" />
        <xsl:template match="node()|@*" name="identity">
            <xsl:copy>
                <xsl:apply-templates select="node()|@*" />
            </xsl:copy>
        </xsl:template>
        <xsl:template match="sfobject/*[1]">
            <queryCompoundEmployeeResponse>
                <CompoundEmployee>
                    <id>
                        <xsl:value-of select="@id" />
                    </id>
                    <xsl:copy-of select="/*/person[1]" />
                    <xsl:call-template name="identity" />
                    </id>
                </CompoundEmployee>
            </queryCompoundEmployeeResponse>
        </xsl:template>
        <xsl:template match="/*/sfobject[1]" />
        <xsl:param name="removeElementsNamed" select="'type'"/>
    </xsl:stylesheet>

这不能很好地检查。我之前在groovy中做过这个,但是现在必须在系统改变时将其转换为xslt。我是xslt的新手,我确信我在这里使用高级xslt。任何指针都非常受欢迎。

xslt在这里完全是正确的工具吗?或者我应该坚持groovy?

1 个答案:

答案 0 :(得分:1)

您需要实施三条规则,似乎

  1. result重命名为queryCompoundEmployeeResponse
  2. sfobject重命名为type
  3. 中的内容
  4. type
  5. 下删除sfobject

    Happuly,这里的每条规则实际上都可以作为单独的模板实现。

    因此,对于规则1,你这样做......

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

    对于规则2,请执行此操作...

    <xsl:template match="sfobject">
        <xsl:element name="{type}">
            <xsl:apply-templates select="node()|@*" />
        </xsl:element>
    </xsl:template>
    

    对于规则3,请执行此操作...

    <xsl:template match="sfobject/type" />
    

    然后使用身份模板处理所有其他节点和属性。

    试试这个XSLT

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output omit-xml-declaration="yes" indent="yes" />
        <xsl:strip-space elements="*" />
    
        <xsl:template match="node()|@*" name="identity">
            <xsl:copy>
                <xsl:apply-templates select="node()|@*" />
            </xsl:copy>
        </xsl:template>
    
        <xsl:template match="result">
            <queryCompoundEmployeeResponse>
                <xsl:apply-templates />
            </queryCompoundEmployeeResponse>
        </xsl:template>
    
        <xsl:template match="sfobject">
            <xsl:element name="{type}">
                <xsl:apply-templates select="node()|@*" />
            </xsl:element>
        </xsl:template>
    
        <xsl:template match="sfobject/type" />
    </xsl:stylesheet>