2015-07-14 3 views
0

Я работаю над проектом, и помощник по команде сгенерировал XML-файл, который несовместим с моим кодом, и я хочу преобразовать XML-файл с помощью XSLT. Я хочу, чтобы преобразовать этот XMLПреобразование XML-элементов в атрибуты XML с использованием XSLT

<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

«* Пожалуйста, помогите мне, чтобы конвертировать XML с помощью XSLT. *» Помочь вам с чем? Вы не показали нам ничего, что мы можем вам помочь. –

+0

, чтобы преобразовать первый пример кода во второй пример кода с помощью xslt ... –

+2

Где именно ваша трудность? Мы здесь, чтобы помочь вам написать собственный код - не писать это для вас. Просмотрите: http://stackoverflow.com/help/how-to-ask –

ответ

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> 

Я надеюсь, что вы будете тратить время на изучение его, так что вы понимаете его.

+0

Большое спасибо .. –

0

Вот еще один вариант, который является немного более общим ...

XSLT 1,0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

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

    <!--Match elements that contain children elements that don't contain 
    children elements themselves.--> 
    <xsl:template match="*[*[not(*)]]"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <xsl:apply-templates select="*[not(*)]" mode="attr"/> 
      <xsl:apply-templates select="*[*]"/>     
     </xsl:copy> 
    </xsl:template> 

    <!--Moded template that turns an element into an attribute.--> 
    <xsl:template match="*" mode="attr"> 
     <xsl:attribute name="{name()}"> 
      <xsl:value-of select="string()"/> 
     </xsl:attribute> 
    </xsl:template> 

    <!--Special handling of empty confidence--> 
    <xsl:template match="confidence[normalize-space()='']" mode="attr"> 
     <xsl:attribute name="confidence"> 
      <xsl:text>0.50</xsl:text> 
     </xsl:attribute>   
    </xsl:template> 

</xsl:stylesheet> 
Смежные вопросы