1

複雑な住所文字列、またはさまざまな形式があり、道路名、家屋番号、階数、位置 (左、右、中央のドア)、またはドア/部屋番号に分割する必要があります。

疑似「含む」を使用して、最後のビットを除いてすべてを行うことができました。

<xsl:choose>
                <xsl:when test="contains(@addressFarLeft, ANY_NUMERIC_VALUE_ANYWHERE)">
                  <door>NUMERICVALUE</door>
                </xsl:when>
                <xsl:otherwise></xsl:otherwise>
              </xsl:choose>

何らかの形の含むだけを使用することはできないと確信していますが、その後はどうすればよいでしょうか?

値は動的に設定されますが、可能な値は次のとおりです。

<xsl:variable name="addressFarLeftValue">.th.</xsl:variable> =>
no numeric value, do nothing

<xsl:variable name="addressFarLeftValue">.1.</xsl:variable> =>
   produce:  <door>1</door>

<xsl:variable name="addressFarLeftValue">, . tv </xsl:variable> =>
no numeric value, do nothing

<xsl:variable name="addressFarLeftValue">,th, 4.</xsl:variable> =>
   produce:   <door>1</door>

助言がありますか?

4

2 に答える 2

5

文字列に数値が含まれているかどうかをテストする場合、1つのアプローチは、「translate」関数を使用して文字列からすべての数字を削除することです。結果の文字列が最初の文字列と一致しない場合は、数が含まれています。文字列が変更されない場合は、変更されていません。

<xsl:choose>
  <xsl:when test="translate($addressFarLeft, '1234567890', '') != $addressFarLeft">
    <door>1</door>
  </xsl:when>
  <xsl:otherwise/>

したがって、を<xsl:variable name="addressFarLeftValue">.1.</xsl:variable>出力します<door>1</door>が、<xsl:variable name="addressFarLeftValue">.th.</xsl:variable>何も出力しません。

実際の数値を抽出したい場合、文字列内に数値が1つしか出現しないと仮定すると、これを行うことができます...

<xsl:value-of 
   select="translate(
      @addressFarLeft, 
      translate(@addressFarLeft, '1234567890', ''), 
      '')" />

したがって、<xsl:variable name="addressFarLeftValue">,th, 42.</xsl:variable>出力42

,th, 42, ab, 1ただし、このアプローチのように複数の番号が存在する場合は失敗します。

于 2012-08-15T12:11:37.023 に答える
3

必要な数値は、Michael Kay によって最初に示された "二重翻訳" メソッドを使用して取得できます。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:variable name="addressFarLeftValue1" select="',th, 4.'"/> 
 <xsl:variable name="addressFarLeftValue2" select="', . tv'"/>  


 <xsl:variable name="vDoorNumber1" select=
  "translate($addressFarLeftValue1,
             translate($addressFarLeftValue1, '0123456789', ''),
             '')"/>
 <xsl:variable name="vDoorNumber2" select=
  "translate($addressFarLeftValue2,
             translate($addressFarLeftValue2, '0123456789', ''),
             '')"/>

 <xsl:template match="/">
     "<xsl:value-of select="$vDoorNumber2"/>"
==========
   "<xsl:value-of select="$vDoorNumber1"/>"
 </xsl:template>
</xsl:stylesheet>

この変換が任意の XML ドキュメント (使用されていない) に適用されると、必要な正しい結果が生成されます。

     ""
==========
   "4"
于 2012-08-15T12:28:41.867 に答える