【问题标题】:Changing tags of a xml based on a dtd基于 dtd 更改 xml 的标签
【发布时间】:2011-04-26 04:11:13
【问题描述】:

我正在使用这个 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 中获取的。感谢您的帮助。

【问题讨论】:

    标签: xml xslt dtd


    【解决方案1】:

    我认为在 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>
    

    如果您不想为 data 元素执行单独的 xsl:template,您可以执行以下操作:

    <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>
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2012-09-21
      • 2020-06-24
      • 1970-01-01
      • 2015-11-25
      • 1970-01-01
      • 2018-09-03
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      相关资源
      最近更新 更多