重命名重复的XML标记

时间:2012-04-17 13:33:45

标签: xml xslt

我有一些带有重复标记名称的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标记。

2 个答案:

答案 0 :(得分:2)

此转化

<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元素的位置生成元素。

答案 1 :(得分:0)

是的,您可以根据需要更改名称,但不会提供您尚未拥有的任何内容。拥有名称街道城市状态与获取节点没有什么不同 地址[1],地址[2],地址[3]