【问题标题】:Rename Duplicate XML Tags重命名重复的 XML 标记
【发布时间】:2013-11-04 11:32:28
【问题描述】:

我有一些带有重复标签名称的 xml XML 文档,如下所示::

<ROOT>
    <RECORD>
        <ID>A1</ID>
        <NAME>Name1</NAME>
        <ADDRESS>StreetName</ADDRESS>
        <ADDRESS>CityName</ADDRESS>
        <ADDRESS>State</ADDRESS>
        <ADDRESS>321</ADDRESS>
        <PHONE>12345</PHONE>
    </RECORD>
    <RECORD>
        <ID>A1</ID>
        <NAME>Name1</NAME>
        <ADDRESS>StreetName</ADDRESS>
        <ADDRESS>CityName</ADDRESS>
        <ADDRESS>State</ADDRESS>
        <ADDRESS>123</ADDRESS>
        <PHONE>12345</PHONE>
    </RECORD>
</ROOT>

所以我必须得到总地址,但是当我应用 XSLT 时,我只得到第一个标记值。 是否有可能将 ADDRESS 标签名称更改为适当的标签名称,如 STREET、CITY、STATE 和 ZIP 标签。

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

    这种转变

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:my="my:my">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
     <xsl:strip-space elements="*"/>
    
     <my:reps>
      <rep pos="1">STREET</rep>
      <rep pos="1">CITY</rep>
      <rep pos="1">STATE</rep>
      <rep pos="1">ZIP</rep>
     </my:reps>
    
     <xsl:variable name="vReps"
          select="document('')/*/my:reps/*"/>
    
     <xsl:template match="node()|@*">
      <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
     </xsl:template>
    
     <xsl:template match="ADDRESS">
      <xsl:variable name="vPos" select=
         "count(preceding-sibling::ADDRESS)+1"/>
      <xsl:element name="{$vReps[position()=$vPos]}">
        <xsl:apply-templates/>
      </xsl:element>
     </xsl:template>
    </xsl:stylesheet>
    

    应用于提供的 XML 文档时

    <ROOT>
        <RECORD>
            <ID>A1</ID>
            <NAME>Name1</NAME>
            <ADDRESS>StreetName</ADDRESS>
            <ADDRESS>CityName</ADDRESS>
            <ADDRESS>State</ADDRESS>
            <ADDRESS>321</ADDRESS>
            <PHONE>12345</PHONE>
        </RECORD>
        <RECORD>
            <ID>A1</ID>
            <NAME>Name1</NAME>
            <ADDRESS>StreetName</ADDRESS>
            <ADDRESS>CityName</ADDRESS>
            <ADDRESS>State</ADDRESS>
            <ADDRESS>123</ADDRESS>
            <PHONE>12345</PHONE>
        </RECORD>
    </ROOT>
    

    产生想要的正确结果

    <ROOT>
       <RECORD>
          <ID>A1</ID>
          <NAME>Name1</NAME>
          <STREET>StreetName</STREET>
          <CITY>CityName</CITY>
          <STATE>State</STATE>
          <ZIP>321</ZIP>
          <PHONE>12345</PHONE>
       </RECORD>
       <RECORD>
          <ID>A1</ID>
          <NAME>Name1</NAME>
          <STREET>StreetName</STREET>
          <CITY>CityName</CITY>
          <STATE>State</STATE>
          <ZIP>123</ZIP>
          <PHONE>12345</PHONE>
       </RECORD>
    </ROOT>
    

    解释

    用匹配ADDRESS的模板覆盖标识规则,并根据这个ADDRESS元素的位置生成一个元素。

    【讨论】:

      【解决方案2】:

      是的,如果您愿意,您可以更改名称,但这不会给您任何您还没有的东西。拥有街道城市州的名称与获取节点没有什么不同 地址[1],地址[2],地址[3]

      【讨论】:

      • 但我不喜欢地址[1]、地址[2]、地址[3]。我对所有这些都有相同的标签名称地址。
      • 是的,你知道。因此,当您在 XSLT 中选择它们时,您可以将它们寻址为:。括号中的数字是标签的出现,所以地址[1]是第一个地址,地址[2]是第二个地址等等。如果你有问题,你需要查找xpath轴
      猜你喜欢
      • 2022-07-06
      • 1970-01-01
      • 2019-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-07
      • 2016-07-15
      相关资源
      最近更新 更多