Изменение тегов xml на основе dtd - PullRequest
1 голос
/ 20 апреля 2011

Я работаю с этим xml

    <?xml version="1.0"?>
  <globalcoverage>
   <carrier>
    <Data>CONTINENT</Data>
    <Data>COUNTY</Data>
    <Data>OPERATOR</Data>
    <Data>FREQUENCY</Data>
    <Data>SIGNATURE</Data>
    <Data>GSM</Data>
    <Data>GPRS</Data>
    <Data>3G</Data>
    <Data>PAYMENT</Data>
    <Data>SMS</Data>
    <Data>ZONE</Data>
    <Data>STATUS</Data>
   </carrier>
   <carrier>
    <Data>AFRICA</Data>
    <Data>ZAMBIA</Data>
    <Data>MTN Zambia</Data>
    <Data>GSM 900</Data>
    <Data>2006-08-14</Data>
    <Data>X</Data>
    <Data>X</Data>
    <Data>X</Data>
    <Data>X</Data>
    <Data>X</Data>
    <Data>NA</Data>
    <Data>0</Data>
   </carrier>
...

В нем гораздо больше записей, я хочу изменить теги, но не хочу делать это по одному.Есть способ сделать это с кислородом, используя это dtd?

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT coverturamundial (item+) >
<!ELEMENT item (continent, county, operator, frequency, signature, gsm, gprs, _3g, payment, sms, zone, status) >
<!ELEMENT continent (#PCDATA) >
<!ELEMENT county (#PCDATA) >
<!ELEMENT operator (#PCDATA) >
<!ELEMENT frequency (#PCDATA) >
<!ELEMENT signature (#PCDATA) >
<!ELEMENT gsm (#PCDATA) >
<!ELEMENT gprs (#PCDATA)>
<!ELEMENT _3g (#PCDATA) >
<!ELEMENT payment (#PCDATA) >
<!ELEMENT sms (#PCDATA) >
<!ELEMENT zone (#PCDATA) >
<!ELEMENT status (#PCDATA)>

Фактически, данные были взяты из xls.Спасибо за вашу помощь.

1 Ответ

2 голосов
/ 21 апреля 2011

Я не думаю, что в oXygen есть автоматизированный способ сделать это.Вы могли бы сделать простое XSLT-преобразование, хотя.Похоже, что в DTD всегда есть 12 Data элементов, которые соответствуют 12 элементам в item.Если это так, вы можете основывать преобразование Data элементов на их позиции.

Вот пример таблицы стилей ( ПРИМЕЧАНИЕ. Я выводлю DOCTYPE с системным идентификатором, чтобы легко проверить выводв oXygen; вы можете удалить / изменить это ):

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

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

  <xsl:template match="globalcoverage">
    <coverturamundial>
      <xsl:apply-templates/>
    </coverturamundial>
  </xsl:template>

  <xsl:template match="carrier">
    <item>
      <xsl:apply-templates/>
    </item>
  </xsl:template>

  <xsl:template match="Data[1]">
    <continent>
      <xsl:apply-templates/>
    </continent>    
  </xsl:template>
  <xsl:template match="Data[2]">
    <county>
      <xsl:apply-templates/>
    </county>    
  </xsl:template>
  <xsl:template match="Data[3]">
    <operator>
      <xsl:apply-templates/>
    </operator>    
  </xsl:template>
  <xsl:template match="Data[4]">
    <frequency>
      <xsl:apply-templates/>
    </frequency>    
  </xsl:template>
  <xsl:template match="Data[5]">
    <signature>
      <xsl:apply-templates/>
    </signature>    
  </xsl:template>
  <xsl:template match="Data[6]">
    <gsm>
      <xsl:apply-templates/>
    </gsm>    
  </xsl:template>
  <xsl:template match="Data[7]">
    <gprs>
      <xsl:apply-templates/>
    </gprs>    
  </xsl:template>
  <xsl:template match="Data[8]">
    <_3g>
      <xsl:apply-templates/>
    </_3g>    
  </xsl:template>
  <xsl:template match="Data[9]">
    <payment>
      <xsl:apply-templates/>
    </payment>    
  </xsl:template>
  <xsl:template match="Data[10]">
    <sms>
      <xsl:apply-templates/>
    </sms>    
  </xsl:template>
  <xsl:template match="Data[11]">
    <zone>
      <xsl:apply-templates/>
    </zone>    
  </xsl:template>
  <xsl:template match="Data[12]">
    <status>
      <xsl:apply-templates/>
    </status>    
  </xsl:template>

</xsl:stylesheet>

Вот что вывод будет использовать ваш пример ввода (измененный, чтобы сделать его правильно сформированным):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE coverturamundial
  SYSTEM "test.dtd">
<coverturamundial>
   <item>
      <continent>CONTINENT</continent>
      <county>COUNTY</county>
      <operator>OPERATOR</operator>
      <frequency>FREQUENCY</frequency>
      <signature>SIGNATURE</signature>
      <gsm>GSM</gsm>
      <gprs>GPRS</gprs>
      <_3g>3G</_3g>
      <payment>PAYMENT</payment>
      <sms>SMS</sms>
      <zone>ZONE</zone>
      <status>STATUS</status>
   </item>
   <item>
      <continent>AFRICA</continent>
      <county>ZAMBIA</county>
      <operator>MTN Zambia</operator>
      <frequency>GSM 900</frequency>
      <signature>2006-08-14</signature>
      <gsm>X</gsm>
      <gprs>X</gprs>
      <_3g>X</_3g>
      <payment>X</payment>
      <sms>X</sms>
      <zone>NA</zone>
      <status>0</status>
   </item>
</coverturamundial>

Если вы не хотите делать отдельные xsl:template для data элементов, вы можете сделать что-то вроде:

<xsl:template match="Data">
    <xsl:choose>
      <xsl:when test="position()=1">
        <continent>
          <xsl:apply-templates/>
        </continent>
      </xsl:when>
      <xsl:when test="position()=2">
        <county>
          <xsl:apply-templates/>
        </county>
      </xsl:when>
    </xsl:choose>
    ...
  </xsl:template>

Надеюсь, это поможет.

...