2012-04-17 17 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]のようになっていません。私はこれらすべてのために同じタグ名のアドレスを持っています。 –

+0

はい、そうです。したがって、XSLTでそれらを選択すると、 "address [2]" />のように指定できます。角括弧内の数字はタグの出現であるため、アドレス[1]は最初のアドレス、アドレス[2]は2番目のアドレスなどです。問題がある場合はxpath軸を参照する必要があります – Woody

+0

はいWoodyはシンプルです。良い。その働き。 –

関連する問題