1

Ich versuche mit einer Funktion sämtliche Zahlen aus 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>

贝斯皮尔 XML:

<address>street 12, 12345 town<address>

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

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

Zum Beispiel die 2 für die Postleitzahl。Das Problem ist nun, dass in der Sequence auch leere Werte stehen, so dass ich in der Praxis die Postleitzahl nur mit [4] erreiche。

Gibt es eine beautifulere Möglichkeit meine Problem zu lösen?Und wenn nicht, wie lösche ich die leeren Elemente aus der Sequence??

现在用英语:-)

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

这是我的功能:

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

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

谢谢 :-)

4

2 回答 2

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

tokenize($pStr, '[^0-9]+')[.] ! xs:integer(.)
于 2013-05-08T14:39:27.283 回答
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>
于 2013-05-08T14:12:12.020 回答