XSLT - make xsl:analyze-string返回字符串而不是字符串序列?

时间:2012-03-22 10:14:03

标签: xslt-2.0

是否可以让xsl:analyze-string返回一个字符串而不是sequence个字符串?

背景:我想在xsl:analyze-string中使用xsl:function来封装模式匹配。理想情况下,该函数应返回xs:string以用作xsl:sort元素中的排序条件。

目前,我必须在函数调用的每个结果上应用string-join(),因为xsl:analyze-string返回一个字符串序列,而xsl:sort不接受这样的序列作为sort标准。请参见样式表的第24行:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:my="www.my-personal-namespa.ce"
        xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xsl:output indent="yes" method="xml"  />

<xsl:function name="my:sortierung" >
    <xsl:param name="inputstring" as="xs:string"/>
    <xsl:analyze-string select="$inputstring" regex="[0-9]+">
        <xsl:matching-substring>
            <xsl:value-of select="format-number(number(.), '00000')" />
        </xsl:matching-substring>
        <xsl:non-matching-substring>
            <xsl:value-of select="." />
        </xsl:non-matching-substring>
    </xsl:analyze-string>
</xsl:function>

<xsl:template match="/input">
    <result>
    <xsl:apply-templates select="value" >
        <xsl:sort select="string-join((my:sortierung(.)), ' ')" />
        </xsl:apply-templates>
    </result>
</xsl:template>

<xsl:template match="value">
    <xsl:copy-of select="." />
</xsl:template>
</xsl:stylesheet>

使用此输入:

<?xml version="1.0" encoding="UTF-8"?>
<input>
    <value>A 1 b 120</value>
    <value>A 1 b 1</value>
    <value>A 1 b 2</value>
    <value>A 1 b 1a</value> 
</input>

在我的例子中,有没有办法修改xsl:function以返回xs:string而不是序列?

1 个答案:

答案 0 :(得分:2)

我认为有几种方法,您可以将analyze-string的结果放入函数内部的变量中,然后在函数中使用xs:sequence select="string-join($var, ' ')"。 但是xsl:value-of以下内容也应该这样做:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:my="www.my-personal-namespa.ce"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        exclude-result-prefixes="my xs">

<xsl:output indent="yes" method="xml"  />

<xsl:function name="my:sortierung" as="xs:string">
    <xsl:param name="inputstring" as="xs:string"/>
    <xsl:value-of separator=" ">
    <xsl:analyze-string select="$inputstring" regex="[0-9]+">
        <xsl:matching-substring>
            <xsl:value-of select="format-number(number(.), '00000')" />
        </xsl:matching-substring>
        <xsl:non-matching-substring>
            <xsl:value-of select="." />
        </xsl:non-matching-substring>
    </xsl:analyze-string>
    </xsl:value-of>
</xsl:function>

<xsl:template match="/input">
    <result>
    <xsl:apply-templates select="value" >
        <xsl:sort select="my:sortierung(.)" />
        </xsl:apply-templates>
    </result>
</xsl:template>

<xsl:template match="value">
    <xsl:copy-of select="." />
</xsl:template>
</xsl:stylesheet>