2012-03-22 66 views
1

是否可以使xsl:analyze-string返回一個字符串而不是sequence的字符串?XSLT - 使xsl:analyze-string返回字符串而不是字符串序列?

背景:我想在xsl:function中使用xsl:analyze-string,它應該封裝模式匹配。理想情況下,該函數應該返回一個xs:string作爲xsl:sort元素中的排序條件。

目前,我需要去申請字符串連接()的函數調用的每一個結果,因爲xsl:analyze-string返回一個字符串的序列,並xsl: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:函數返回的xs:字符串,而不是一個序列?

回答

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

非常感謝,完美的作品! – tohuwawohu 2012-03-22 12:57:24