使用XSLT将XML元素转换为XML属性

时间:2015-07-14 08:31:48

标签: xml xslt

我正在开发一个项目,团队伙伴生成了一个与我的代码不兼容的XML文件,我想使用XSLT转换XML文件。我想转换这个XML

<frame>
   <frameNo>0</frameNo>
   <objectlist>
      <object>
         <confidence>0.95</confidence>
         <box>
            <h>775</h>
            <w>202</w>
            <xc>509</xc>
            <yc>8.6</yc>
         </box>
      </object>
      <object>
         <confidence></confidence>
         <box>
            <h>966</h>
            <w>220</w>
            <xc>1779</xc>
            <yc>1080</yc>
         </box>
      </object>
   </objectlist>
</frame>

到此XML文件

<frame number="0">
   <objectlist>
       <object confidence = "0.95">
           <box h="775" w="202" xc="509" yc="8.68"/>
       </object>
       <object confidence = "0.50">
           <box h="996" w="220" xc="1779" yc="1080" />
       </object>
   </objectlist>
</frame>

任何人都可以帮我转换这个xml使用XSLT。

1 个答案:

答案 0 :(得分:0)

虽然这个论坛不适用于此类问题,但我愿意为您提供解决方案,因为您赶时间。

您需要从中学到的另一个重要教训是,XML在您和您的队友之间充当API。您之前应该已经讨论过这个问题,以防止您现在遇到的不一致。

您需要的XSLT是:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="frame">
        <xsl:element name="frame">
            <xsl:attribute name="number">
                <xsl:value-of select="frameNo" />
            </xsl:attribute>
            <xsl:apply-templates select="objectlist" />
        </xsl:element>
    </xsl:template>

    <xsl:template match="objectlist">
        <xsl:element name="objectlist">
            <xsl:apply-templates select="./object" />
        </xsl:element>
    </xsl:template>

    <xsl:template match="object">
        <xsl:element name="object">
            <xsl:attribute name="confidence">
                <xsl:if test="normalize-space(confidence) != '' ">
                    <xsl:value-of select="confidence" />
                </xsl:if>
                <xsl:if test="normalize-space(confidence) = '' ">
                    <xsl:text>0.50</xsl:text>
                </xsl:if>
            </xsl:attribute>
            <xsl:apply-templates select="./*[not(self::confidence)]" />
        </xsl:element>
    </xsl:template>

    <xsl:template match="box">
        <xsl:element name="box">
            <xsl:for-each select="*">
                <xsl:attribute name="{name()}" >
                    <xsl:value-of select="text()" />
                </xsl:attribute>
            </xsl:for-each>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

我希望你能花时间研究它,以便你理解它。