根据dtd更改xml的标记

时间:2011-04-20 17:38:05

标签: xml xslt dtd

我正在使用这个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 个答案:

答案 0 :(得分:2)

我认为在oXygen中没有自动化的方法。你可以做一个简单的XSLT转换。看起来总共有12个Data元素对应于DTD中item中的12个元素。如果是这样,您可以将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>

希望这有帮助。