2017-10-26 9 views
0

を置き換える私は2つのXMLファイルを持っている:二ファイル内のXSLキーのルックアップ&要素

Source.xml

<osm> 
    <count> 
    <tag k="total" v="1560"/> 
    </count> 
    <node> 
    <tag k="fhrs:id" v="111111"/> 
    </node> 
    <node> 
    <tag k="fhrs:id" v="222222"/> 
    <tag k="addr:postcode" v="XXX XXX"/> 
    </node> 
    <node> 
    <tag k="fhrs:id" v="333333"/> 
    <tag k="addr:postcode" v="YYY YYY"/> 
    </node> 
    <way> 
    <tag k="fhrs:id" v="444444"/> 
    </way> 
    <way> 
    <tag k="fhrs:id" v="555555"/> 
    <tag v="ZZZ ZZZ"/> 
    </way> 
</osm> 

Lookup.xml

<FHRSEstablishment> 
    <EstablishmentCollection> 
     <EstablishmentDetail> 
      <FHRSID>111111</FHRSID> 
      <PostCode>BA1 111</PostCode> 
     </EstablishmentDetail> 
     <EstablishmentDetail> 
      <FHRSID>333333</FHRSID> 
      <PostCode>BA2 222</PostCode> 
     </EstablishmentDetail> 
     <EstablishmentDetail> 
      <FHRSID>555555</FHRSID> 
      <PostCode>BA3 333</PostCode> 
     </EstablishmentDetail> 
    </EstablishmentCollection> 
</FHRSEstablishment> 

私が対応を使用してそれらを比較したいです@v source.xmlのk=fhrs:id属性の値はlo​​okup.xmlのノード値がFHRSIDで、修正されたバージョンのsource.xmlが生成されます。

一致が見つかった場合は、k="addr:postcode"というタグ要素の@v属性の値を置き換えるには、Postcodeノードの値をコピーする必要があります。これは、現在の出力

<osm> 
    <count> 
     <tag k="total" v="1560"/> 
    </count> 
    <node> 
     <tag k="addr:postcode" v="BA1 111"/> 
    </node> 
    <node> 
     <tag k="fhrs:id" v="222222"/> 
     <tag k="addr:postcode" v="XXX XXX"/> 
    </node> 
    <node> 
     <tag k="addr:postcode" v="BA2 222"/> 
     <tag k="addr:postcode" v="YYY YYY"/> 
    </node> 
    <way> 
     <tag k="fhrs:id" v="444444"/> 
    </way> 
    <way> 
     <tag k="addr:postcode" v="BA3 333"/> 
     <tag k="addr:postcode" v="ZZZ ZZZ"/> 
    </way> 
</osm> 

これは、所望のouputをある

<xsl:key name="FHRSID-key" match="FHRSID" use="node()"/> 
<xsl:variable name="lookup-doc" select="doc('lookup.xml')"/> 

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*/tag[@v and key('FHRSID-key', @v, $lookup-doc)]"> 
    <xsl:copy> 
     <xsl:attribute name="k">addr:postcode</xsl:attribute> 
     <xsl:attribute name="v" select="key('FHRSID-key', @v, $lookup-doc)/../PostCode/node()"/> 
    </xsl:copy> 
</xsl:template> 

これは、XSLフィーユある

<osm> 
    <count> 
    <tag k="total" v="1560"/> 
    </count> 
    <node> 
    <tag k="fhrs:id" v="111111"/> 
    <tag k="addr:postcode" v="BA1 111"/> 
    </node> 
    <node> 
    <tag k="fhrs:id" v="222222"/> 
    <tag k="addr:postcode" v="XXX XXX"/> 
    </node> 
    <node> 
    <tag k="fhrs:id" v="333333"/> 
    <tag k="addr:postcode" v="BA2 222"/> 
    </node> 
    <way> 
    <tag k="fhrs:id" v="444444"/> 
    </way> 
    <way> 
    <tag k="fhrs:id" v="555555"/> 
    <tag k="addr:postcode" v="BA3 333"/> 
    </way> 
</osm> 

元のk="addr:postcode"ではなく、'fhrs:id'要素をコピーした郵便番号要素に置き換えています。

付帯質問は:

match="*/tag[@v and key('FHRSID-key', @v, $lookup-doc)]" 

@vの最初の発生は、実際には何をしているのですか?

私にとって、このマッチはすべてのタグ要素を検索しているようです。もしそうなら、どうすればk="addr:postcode"属性を持つものだけを見るように制限できますか?

その他の改善が推奨される場合は、お気軽にご相談ください。親

<xsl:key name="FHRSID-key" match="EstablishmentDetail" use="FHRSID"/> 
<xsl:variable name="lookup-doc" select="doc('lookup.xml')"/> 

<xsl:output indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*[tag[@k = 'fhrs:id' and key('FHRSID-key', @v, $lookup-doc)]]"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* , node() except tag[@k = 'addr:postcode']"/> 
     <tag k="addr:postcode" v="{key('FHRSID-key', tag[@k = 'fhrs:id']/@v, $lookup-doc)/PostCode}"/> 
    </xsl:copy> 
</xsl:template> 

に合致するようにコードを変更する

答えて

0

唯一の問題は<tag v="ZZZ ZZZ"/>要素であるように思わ

<osm> 
    <count> 
     <tag k="total" v="1560"/> 
    </count> 
    <node> 
     <tag k="fhrs:id" v="111111"/> 
     <tag k="addr:postcode" v="BA1 111"/> 
    </node> 
    <node> 
     <tag k="fhrs:id" v="222222"/> 
     <tag k="addr:postcode" v="XXX XXX"/> 
    </node> 
    <node> 
     <tag k="fhrs:id" v="333333"/> 
     <tag k="addr:postcode" v="BA2 222"/> 
    </node> 
    <way> 
     <tag k="fhrs:id" v="444444"/> 
    </way> 
    <way> 
     <tag k="fhrs:id" v="555555"/> 
     <tag v="ZZZ ZZZ"/> 
     <tag k="addr:postcode" v="BA3 333"/> 
    </way> 
</osm> 

を与えます。 tag k="fhrs:id"をそのまま最後のテンプレートに変更したい場合は、既存のコンテンツをコピーするかコピーしないかを判断できません

<xsl:template match="*[tag[@k = 'fhrs:id' and key('FHRSID-key', @v, $lookup-doc)]]"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* , tag[@k = 'fhrs:id']"/> 
     <tag k="addr:postcode" v="{key('FHRSID-key', tag[@k = 'fhrs:id']/@v, $lookup-doc)/PostCode}"/> 
    </xsl:copy> 
</xsl:template>