3

我正在尝试创建一个变量,该变量以 init cap 形式存储输入字符串 (TypeInput) 的值。这个新变量将在我的样式表的不同位置使用。我创建了一个模板,我调用它来将输入字符串转换为 init cap 形式。但是,当我运行样式表时,生成的变量 TypeInputInitCap 在调试器中显示为 NodeSet(1) 并且不会在我的输出中输出文本。任何想法为什么?请参阅下面的示例。

<xsl:variable name="TypeInputInitCap">
    <xsl:call-template name="ConvertToInitCapString">
        <xsl:with-param name="str" select="$TypeInput"></xsl:with-param>
    </xsl:call-template>    
</xsl:variable>

<xsl:template name="ConvertToInitCapString">
    <xsl:param name="str"></xsl:param>        
    <!-- Extract each component of the name delimited by . -->
    <xsl:variable name="TokenNodeSet">
        <xsl:for-each select="tokenize($str, '.')">
            <!-- Init cap each component -->
            <xsl:value-of select="concat(upper-case(substring(.,1,1)), lower-case(substring(.,2)))"></xsl:value-of>
        </xsl:for-each>
    </xsl:variable>
    <xsl:for-each select="$TokenNodeSet">
        <xsl:value-of select="."></xsl:value-of>
        <xsl:if test="not(last())">
            <xsl:text>.</xsl:text>
        </xsl:if>
    </xsl:for-each>
</xsl:template>
4

3 回答 3

1

我认为问题在于该$TokenNodeSet变量仅包含一个字符串,因此第二个for-each仅循环一次。

不如这样做:

<xsl:template name="ConvertToInitCapString"> 
  <xsl:param name="str"></xsl:param>         
  <xsl:for-each select="tokenize($str, '\.')"> 
    <xsl:value-of select="concat(upper-case(substring(.,1,1)), lower-case(substring(.,2)))"/> 
    <xsl:if test="not(last())"> 
        <xsl:text>.</xsl:text> 
    </xsl:if> 
  </xsl:for-each> 

编辑

tokenize()按照 LarsH 在评论中的建议修复了上面的调用

于 2012-10-08T15:02:42.787 回答
0

感谢你的帮助。我的模板中的第二部分不是必需的,所以我现在使用这个版本,它可以工作。它重新添加了一个“。” 标记之间的字符。(我没有使用这个线程中建议的短版本,因为如果连接起来,我会在最后加上一个额外的点。):

<xsl:template name="ConvertToInitCapString">
    <xsl:param name="str" select="."></xsl:param>        
    <!-- Extract each component of the name delimited by . -->
    <xsl:for-each select="tokenize($str, '\.')">
        <!-- Init cap each component -->
        <xsl:value-of select="concat(upper-case(substring(.,1,1)), lower-case(substring(.,2)))"></xsl:value-of>                
        <xsl:if test="position() != last()">
            <xsl:value-of select="'.'"></xsl:value-of>
        </xsl:if>
    </xsl:for-each>                              
</xsl:template>
于 2012-10-08T18:11:47.723 回答
0

我会替换

<xsl:variable name="TokenNodeSet">
    <xsl:for-each select="tokenize($str, '.')">
        <!-- Init cap each component -->
        <xsl:value-of select="concat(upper-case(substring(.,1,1)), lower-case(substring(.,2)))"></xsl:value-of>
    </xsl:for-each>
</xsl:variable>

<xsl:variable name="TokenNodeSet" select="for $token in tokenize($str, '\.') return concat(upper-case(substring($token,1,1)), lower-case(substring($token,2)))" />

或者更好的是

<xsl:variable name="TokenNodeSet" as="xs:string*" select="for $token in tokenize($str, '\.') return concat(upper-case(substring($token,1,1)), lower-case(substring($token,2)))" />

或者最后因为它是没有节点集的 XSLT 2.0,我将变量重命名为例如

<xsl:variable name="TokenSequence" as="xs:string*" select="for $token in tokenize($str, '\.') return concat(upper-case(substring($token,1,1)), lower-case(substring($token,2)))" />
于 2012-10-08T15:56:15.863 回答