在xslt 1.0中,如果value包含字符串值内的数字

时间:2012-08-15 11:59:17

标签: xslt xslt-1.0

我有一个复杂的地址字符串,或者说是不同的可能格式,我需要将其拆分为道路名称,门牌号码,楼层,位置(左,右,middel门)或门/房间号

我已经成功地完成了最后一点,伪“包含”:

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

有什么建议吗?

2 个答案:

答案 0 :(得分:4)

如果你想测试字符串是否包含数值,一种方法可能是使用'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>不会输出任何内容。

IF 你想提取实际数字,然后假设字符串中只有一个数字出现,你可以这样做......

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

因此,<xsl:variable name="addressFarLeftValue">,th, 42.</xsl:variable>输出 42

如果您有多个号码,例如,th, 42, ab, 1,这种方法会失败。

答案 1 :(得分:2)

可以使用“双翻译”方法获取所需的数值,首先由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"