如何找到一个字符串中的所有数字



Ich versuche mit einer function sämtliche Zahlen aus einem元素顺序字符串允许。大北将死于安扎尔·德·扎伦和三名斯泰利基特律师事务所。Folgende function:

<xsl:function name="itp:find_num">
<xsl:param name="tmp"/>
<xsl:if test="matches($tmp,'d+')">
    <xsl:analyze-string select="$tmp" regex="{'d+'}">
        <xsl:matching-substring>
             <xsl:sequence select="."/>
        </xsl:matching-substring>
        <xsl:non-matching-substring>
            <xsl:value-of select="''"/>
        </xsl:non-matching-substring>
    </xsl:analyze-string>
</xsl:if>
</xsl:function>

Beispiel XML:

<address>street 12, 12345 town<address>

Bei dem funcktionsaufruf soll dann die entsprechende Zahl ausgewählt werden können:

...select="itp:find_num(address)[2]"/>

Zum Beispiel die 2 f r die Postleitzahl。如Problem ist nun,在der Sequence中分类,在der Sequence中分类,因此在der Praxis中分类,在Postleitzahl中分类[4]。

gibes eine elegere Möglichkeit meine Problem zu lösen?晚上,我们如何lösche将元素元素与序列联系起来?

现在用英语说:-)

我试图找到一个元素顺序字符串中的所有数字。不管有多少个数字可用,或者它们在字符串中的哪个位置。

下面是我的函数:

<xsl:function name="itp:find_num">
<xsl:param name="tmp"/>
<xsl:if test="matches($tmp,'d+')">
    <xsl:analyze-string select="$tmp" regex="{'d+'}">
        <xsl:matching-substring>
        <xsl:if test=". != ''">
            <xsl:sequence select="."/>
        </xsl:if>
        </xsl:matching-substring>
        <xsl:non-matching-substring>
            <xsl:value-of select="''"/>
        </xsl:non-matching-substring>
    </xsl:analyze-string>
</xsl:if>
</xsl:function>

示例XML

<address>street 12, 12345 town<address>

当我调用我想要选择的函数时,我想选择哪个数字:

...select="itp:find_num(address)[2]"/>
邮政编码

示例[2]。我遇到的问题是,序列中有空元素,所以我必须选择[4]来获得邮政编码。

有没有更简单的方法来解决我的问题?或者是否有一种方法可以删除该序列中的所有空元素?

谢谢:-)

根本不需要复杂的xsl:analyze-string处理。

XPath一行代码:

   for $i in tokenize($pStr, '[^0-9]+')[.]
    return xs:integer($i)

生成字符串中所需整数的序列:

12 12345

这是一个完整的转换:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="my:my">
 <xsl:output method="text"/>
 <xsl:template match="/*">
  <xsl:sequence select="my:nums(.)"/>
 </xsl:template>
 <xsl:function name="my:nums" as="xs:integer*">
  <xsl:param name="pStr" as="xs:string"/>
  <xsl:sequence select=
  "for $i in tokenize($pStr, '[^0-9]+')[.]
    return xs:integer($i)"/>
 </xsl:function>
</xsl:stylesheet>

当对提供的XML文档应用此转换时:

<address>street 12, 12345 town</address>

生成所需的正确结果:

12 12345

更简单,XPath 3.0的一行代码:

tokenize($pStr, '[^0-9]+')[.] ! xs:integer(.)

我将把函数写为

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:mf="http://example.org/mf"
  exclude-result-prefixes="xs mf">
<xsl:function name="mf:find_num" as="xs:integer*">
  <xsl:param name="input" as="xs:string"/>
  <xsl:analyze-string select="$input" regex="[0-9]+">
    <xsl:matching-substring>
      <xsl:sequence select="xs:integer(.)"/>
    </xsl:matching-substring>
  </xsl:analyze-string>
</xsl:function>
<xsl:template match="address">
  <xsl:value-of select="mf:find_num(.)" separator=", "/>
</xsl:template>
</xsl:stylesheet>

当然,转换为xs:integer是可选的,如果您希望函数返回包含数字的字符串序列,您只需将其更改为

<xsl:function name="mf:find_num" as="xs:string*">
  <xsl:param name="input" as="xs:string"/>
  <xsl:analyze-string select="$input" regex="[0-9]+">
    <xsl:matching-substring>
      <xsl:sequence select="."/>
    </xsl:matching-substring>
  </xsl:analyze-string>
</xsl:function>

相关内容

  • 没有找到相关文章

最新更新