2012-04-17 100 views
0

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

该转化

<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元件的位置的元件的标识的规则。

0

是的,你可以改变名字,如果你想,但不会给你任何你没有的东西。具有名称街道城市状态将得到的节点 地址[1],地址没有不同[2],地址[3]

+0

但我不像地址[1],地址[2],地址[3]。我有相同的标签名称地址为所有这些。 – 2012-04-17 14:08:27

+0

是的,你这样做。因此,当您在XSLT中选择它们时,您可以将它们解决为:。括号中的数字是标签的出现,所以地址[1]是第一个地址,地址[2]是第二个地址等。如果您遇到问题,您需要查找xpath轴 – Woody 2012-04-17 14:16:42

+0

是的木质其简单。好。它的工作。 – 2012-04-17 17:06:18