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

如果要测试字符串是否包含数值,一种方法是使用“翻译”函数从字符串中删除所有数字,如果结果字符串与初始字符串不匹配,则必须已包含一个数字。如果字符串没有改变,那么它没有改变。

<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>不输出任何东西。

如果您想提取实际数字,然后假设字符串中只出现一次数字,您可以这样做......

<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 回答