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