2

私はこれらのxmlデータのセットを持っています

<Address>
<Rowinfo>
<LocatorDesignator>Dwelling  (Part Of), Null</LocatorDesignator>
<LocatorName>Flat  - Buena Villa House</LocatorName>
<thoroughfare>James Passage</thoroughfare>
<AddressArea>Modakeke island</AddressArea>
</Rowinfo>
<Rowinfo>
<LocatorDesignator>Flat  - Buena Villa House, 1</LocatorDesignator>
<LocatorName>Flat  3a  Anderson's House</LocatorName>
<thoroughfare>Abesinia Passage</thoroughfare>
<AddressArea> Buena Villa Road</AddressArea>
</Rowinfo>
<Rowinfo>
<LocatorDesignator>Offices Unit 2a Funlife Building, 02a</LocatorDesignator>
<LocatorName>Offices Unit 2a   Funlife Building  <LocatorName>
<thoroughfare> Modakeke island</thoroughfare>
<AddressArea>Laguna Estate</AddressArea>
</Rowinfo>
</Address>

私はそれらをこれに変換したい

<LocatorDesignator>Dwelling(Part Of)</LocatorDesignator>
<LocatorName>Buena Villa House</LocatorName>
<thoroughfare>James Passage </thoroughfare>
<AddressArea>Modakeke island</AddressArea>


<LocatorDesignator>Flat 1</LocatorDesignator>
<LocatorName> Anderson's House</LocatorName>
<thoroughfare>Abesinia Passage</thoroughfare>
<AddressArea> </AddressArea>


<LocatorDesignator>Offices Unit 2a</LocatorDesignator>
<LocatorName> Funlife Building  <LocatorName>
<thoroughfare> </thoroughfare>
<AddressArea>Laguna Estate</AddressArea>

基本的に (addressarea) 要素では、不動産と島をサフィックスとして値を抽出したいと考えています。大通り要素で、接尾辞として不動産と島を含む値を削除したいと思います。家または建物を含む値は、ロケーター名で抽出されます。

4

1 に答える 1

0

I. でAddressArea終わらないテキスト ノードを削除し"island"ます。

<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
     <xsl:strip-space elements="*"/>

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

     <xsl:template match=
     "AddressArea/text()
       [substring(., string-length() -5) != 'island'
       and
        substring(., string-length() -5) != 'Estate'
       ]"/>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると (整形式になるように修正されます):

<Address>
    <Rowinfo>
        <LocatorDesignator>Dwelling  (Part Of), Null</LocatorDesignator>
        <LocatorName>Flat  - Buena Villa House</LocatorName>
        <thoroughfare>James Passage</thoroughfare>
        <AddressArea>Modakeke island</AddressArea>
    </Rowinfo>
    <Rowinfo>
        <LocatorDesignator>Flat  - Buena Villa House, 1</LocatorDesignator>
        <LocatorName>Flat  3a  Anderson's House</LocatorName>
        <thoroughfare>Abesinia Passage</thoroughfare>
        <AddressArea></AddressArea>
    </Rowinfo>
    <Rowinfo>
        <LocatorDesignator>Offices Unit 2a Funlife Building, 02a</LocatorDesignator>
        <LocatorName>Offices Unit 2a   Funlife Building  </LocatorName>
        <thoroughfare> Modakeke island</thoroughfare>
        <AddressArea>Laguna Estate</AddressArea>
    </Rowinfo>
</Address>

Ⅱ.の処理thoroughfare

このテンプレートを上記のコードに追加するだけです。

 <xsl:template match=
  "thoroughfare/text()
       [substring(., string-length() -5) = 'island']"/>  

完全なコードは次のようになります。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
     <xsl:strip-space elements="*"/>

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

     <xsl:template match=
     "AddressArea/text()
       [substring(., string-length() -5) != 'island'
       and
        substring(., string-length() -5) != 'Estate'
       ]"/>

     <xsl:template match=
     "thoroughfare/text()
       [substring(., string-length() -5) = 'island']"/>
</xsl:stylesheet>

提供された XML ドキュメント (上記) に適用すると、必要な正しい結果が生成されます。

<Address>
    <Rowinfo>
        <LocatorDesignator>Dwelling  (Part Of), Null</LocatorDesignator>
        <LocatorName>Flat  - Buena Villa House</LocatorName>
        <thoroughfare>James Passage</thoroughfare>
        <AddressArea>Modakeke island</AddressArea>
    </Rowinfo>
    <Rowinfo>
        <LocatorDesignator>Flat  - Buena Villa House, 1</LocatorDesignator>
        <LocatorName>Flat  3a  Anderson's House</LocatorName>
        <thoroughfare>Abesinia Passage</thoroughfare>
        <AddressArea/>
    </Rowinfo>
    <Rowinfo>
        <LocatorDesignator>Offices Unit 2a Funlife Building, 02a</LocatorDesignator>
        <LocatorName>Offices Unit 2a   Funlife Building  </LocatorName>
        <thoroughfare/>
        <AddressArea>Laguna Estate</AddressArea>
    </Rowinfo>
</Address>

III. XSLT 2.0 ソリューション

これは簡単です。(XSLT 1.0 ソリューションの) 述語で標準の XPath 2.0 関数を使用するだけends-with()です。

于 2012-08-22T13:29:36.230 に答える