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]来获取邮政编码。
有没有更简单的方法来解决我的问题? 或者有没有办法删除该序列中的所有空元素?
谢谢: - )
答案 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>