を置き換える私は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
属性の値はlookup.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>
に合致するようにコードを変更する
は