0

最初の空白の後に分割する必要がある住所があります (通りの名前は最初の空白の後に始まると想定しても問題ないと思います)。次に、テキストの各セクション (通りの名前/ドア番号/私書箱) を異なるノードに割り当てる必要があります。句読点もすべて削除する必要があります。

コードはこれを取る必要があります:

<address>123 1st St., P.O. Box 321</address>

そして、これを次のようにします。

<door_num>123</door_num>
<street_name>1st St</street_name>
<addr_postfix>PO Box 321</addr_postfix>

文字列内の特定の文字または位置を指定して文字列を分割する方法についていくつかの質問を見てきましたが、両方のパラメーターを使用することはありません。私は当初、文字列をスキャンして任意の番号を選択しようと考えていましたが、これは私書箱の番号や番地のある通りでは機能しないと考えました。

substring-before および substring-after 演算子を使用する必要があると考えていますが、適切に実装する方法がわかりません。また、これは非常に複雑で、どこから始めればよいかさえわかりません

ありがとう、

アレン

4

2 に答える 2

1

提供された XML ドキュメントの場合に機能する完全な変換を次に示します。

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

 <xsl:template match="address">
   <xsl:variable name="vNum" select="substring-before(.,' ')"/>
   <xsl:variable name="vStreet" select=
    "substring-before(substring-after(.,$vNum), ',')"/>
   <xsl:variable name="vPOBox" select="substring-after(.,',')"/>

   <door_num><xsl:value-of select="$vNum"/></door_num>
   <street_name>
    <xsl:value-of select="normalize-space(translate($vStreet, '.',''))"/>
   </street_name>
   <addr_postfix>
    <xsl:value-of select="normalize-space(translate($vPOBox, '.',''))"/>
   </addr_postfix>
 </xsl:template>
</xsl:stylesheet>

提供された XML ドキュメントに適用した場合:

<address>123 1st St., P.O. Box 321</address>

必要な正しい結果が生成されます。

<door_num>123</door_num>
<street_name>1st St</street_name>
<addr_postfix>PO Box 321</addr_postfix>
于 2012-08-16T02:18:08.863 に答える
0

これにより、例のアドレスの特定のケースが解決され、開始できる可能性があります。

<xsl:template match="address">
    <door_num>
       <xsl:value-of select="substring-before(., ' ')"/>
    </door_num>
    <street_name>
       <xsl:value-of select="translate(substring-before(substring-after(., ' '), ','), '.', '')"/>
    </street_name>
    <addr_postfix>
       <xsl:value-of select="translate(normalize-space(substring-after(., ',')), '.', '')"/>
     </addr_postfix>
</xsl:template>
于 2012-08-16T01:11:04.587 に答える