根据 dtd 更改 xml 的标签

发布于 2024-11-02 13:08:22 字数 1759 浏览 1 评论 0原文

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

I'm working with this 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>
...

It has a lot more records, I want to change the tags, but don't want to do it one by one. There is a way to do it with oxygen using this 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)>

In fact, the data was taken from a xls. Thanks for your help.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

久而酒知 2024-11-09 13:08:23

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

希望这样有帮助。

I don't think that there is an automated way to do this in oXygen. You could do a simple XSLT transform though. It looks like there are always 12 Data elements that correspond to the 12 elements in item in the DTD. If this is true, you can base the conversion of Data elements on their position.

Here's a sample stylesheet (NOTE: I'm outputting a DOCTYPE with a system identifier to easily validate the output in oXygen; you can remove/change this):

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

Here's what the output would be using your sample input (modified to make it well formed):

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

If you don't want to do individual xsl:template's for the data elements, you can do something like:

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

Hope this helps.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文