2012-03-22 4 views
1

xsl:analyze-stringは文字列のsequenceの代わりに1つの文字列を返すことはできますか?XSLT - make xsl:analyze-stringは文字列のシーケンスではなく文字列を返しますか?

背景:パターンマッチングをカプセル化するxsl:functionxsl:analyze-stringを使用したいと思います。理想的には、この関数は、要素でソート基準として使用するxs:stringを返す必要があります。

瞬間、私はxsl:analyze-stringは、一連の文字列を返し、xsl:sortは、ソート基準として、このようなシーケンスを受け付けないので、関数呼び出しのすべての結果に文字列の参加を()を適用しなければなりません。この入力で

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

:スタイルシートの24行を参照してくださいXSを返すために、機能:文字列の代わりに、一連の私の例では

<?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を変更する方法はありますか?

答えて

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

関連する問題