Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XSLT标记化节点集_Xslt_Tokenize - Fatal编程技术网

XSLT标记化节点集

XSLT标记化节点集,xslt,tokenize,Xslt,Tokenize,我试图创建一个变量,以init cap形式存储输入字符串(TypeInput)的值。这个新变量将在样式表中的不同位置使用。我创建了一个模板,调用该模板将输入字符串转换为init cap表单。但是,当我运行样式表时,生成的变量TypeInputInitCap在调试器中显示为NodeSet(1),并且不会在输出中输出文本。你知道为什么吗?见下面的示例 <xsl:variable name="TypeInputInitCap"> <xsl:call-template name

我试图创建一个变量,以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>

.

我认为问题在于
$TokenNodeSet
变量只包含一个字符串,因此每个
的第二个
只循环一次

这样做怎么样:

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

. 

编辑

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

我将替换

<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" as="xs:string*" select="for $token in tokenize($str, '\.') return concat(upper-case(substring($token,1,1)), lower-case(substring($token,2)))" />

最后,由于XSLT2.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)))" />


谢谢大家的帮助。我的模板中的第二部分不是必需的,所以我现在使用这个版本,它可以工作。它在标记之间重新添加一个“.”字符。(我没有使用此线程中建议的短版本,因为如果连接,我将在末尾附加一个点。):



请给出一个输入示例(str
参数的值)。这是正确的。。。for each将连接其结果:“对于输入序列中的每个项,对序列构造函数求值将生成一个项序列……这些输出序列将被连接”()。规范有点模棱两可,但字符串结果显然连接到单个字符串中,而不是字符串序列中。然而,这并不能解释OP说他没有得到任何输出的事实。他应该得到整个字符串(没有
字符)作为输出。@LarsH:是的,要得到一个字符串序列,您必须创建一个XML元素来封装每个字符串string@OP:另一个主要问题是使用
作为标记化分隔符模式。第二个参数是正则表达式,因此
匹配任何字符。如果您将其更改为
,\.\.
,MiMo的解决方案应该可以工作;e、 g.
tokenize()
返回该值。但是,也许您的具体意思是作为
xsl:for each
的结果。是的,实际上我的问题是没有转义“.”字符。转义后,现在我得到了一个带“.”的串联字符串。这是一个优雅而简洁的解决方案,将所有内容都放在一行中。请注意,使用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)))" />
<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>