如何查找字符串中的所有数字

时间:2013-05-08 13:18:57

标签: xslt xslt-2.0 xpath-2.0 xpath-3.0

Ich versuche mit einerFunktionsämtlicheZahlenaus einem Element oder String zu ermitteln。 Dabei soll die Anzahl der Zahlen und ihre Stelligkeit egal sein。 Folgende Funktion habe ich bislang geschrieben:

<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 Funktionsaufruf soll dann die entsprechendeZahlausgewähltwerdenkönnen:

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

Zum Beispiel死于Postleitzahl。 Das Problem ist nun,dass in der auch leere Werte stehen,所以dass ich in der Praxis die Postleitzahl nur mit [4] erreiche。

Gibt es eineelegantereMöglichkeitmeine问题zulösen? Und wenn nicht,wielöscheich die leeren Elemente aus der Sequence ??

现在在Englisch: - )

我正在尝试查找元素或字符串中的所有数字。无论有多少数字可用,或者它们在字符串中的位置都无关紧要。

这是我的功能:

<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]来获取邮政编码。

有没有更简单的方法来解决我的问题? 或者有没有办法删除该序列中的所有空元素?

谢谢: - )

2 个答案:

答案 0 :(得分:2)

根本不需要复杂的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(.)

答案 1 :(得分:1)

我会将函数写为

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