首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对字符串中的每个字符进行标记化会导致错误

对字符串中的每个字符进行标记化会导致错误
EN

Stack Overflow用户
提问于 2015-06-17 09:43:12
回答 2查看 144关注 0票数 0

我正在尝试解决Word的Office Open XML中丢失自定义XML的问题,但我遇到了一些问题。

我正在研究一种方法来跟踪对共享教案存储库的贡献,该存储库将驻留在Omeka网站上。

代码语言:javascript
复制
<w:p w:rsidR="00196751" w:rsidRDefault="00956712">
    <w:r>
        <w:t>Some sample text.</w:t>
    </w:r>
    <w:bookmarkStart w:id="0" w:name="_GoBack"/>
    <w:bookmarkEnd w:id="0"/>
</w:p>

我需要它看起来像这样:

代码语言:javascript
复制
<w:p w:rsidR="00196751" w:rsidRDefault="00956712">
            <w:bookmarkStart w:id="0" w:name="_NAME_0001_20150616_1"/>
            <w:r>
                <w:t>S</w:t>
            </w:r>
            <w:bookmarkStart w:id="1" w:name="_NAME_0001_20150616_2"/>
            <w:bookmarkEnd w:id="0"/>
            <w:r>
                <w:t>o</w:t>
            </w:r>
            <w:bookmarkStart w:id="2" w:name="_NAME_0001_20150616_3"/>
            <w:bookmarkEnd w:id="1"/>
            <w:r>
                <w:t>m</w:t>
            </w:r>
            <w:bookmarkStart w:id="3" w:name="_NAME_0001_20150616_4"/>
            <w:bookmarkEnd w:id="2"/>
            <w:r>
                <w:t>e</w:t>
            </w:r>
            <w:bookmarkStart w:id="4" w:name="_NAME_0001_20150616_5"/>
            <w:bookmarkEnd w:id="3"/>
            <w:r>
                <w:t xml:space="preserve"> </w:t>
            </w:r>
[...]
<w:bookmarkStart w:id="17" w:name="_GoBack"/>
<w:bookmarkEnd w:id="16"/>
<w:bookmarkEnd w:id="17"/>
</w:p>

代码语言:javascript
复制
<xsl:template match="w:t">
    <xsl:value-of select="tokenize(., '.??')"/>
</xsl:template>

我的假设是,这是因为函数没有实际的模式来进行标记化,因为我要求它在每个字符上分开。谢谢!

EN

回答 2

Stack Overflow用户

发布于 2015-06-17 10:17:44

您应该有一个用于此的模板,您可以将其应用于您的原始<w:t>值:

代码语言:javascript
复制
<xsl:template name="tokenize">
    <xsl:param name="text"/>
    <xsl:choose>
        <xsl:when test="string-length($text) = 1">
            <w:r>
                <w:t><xsl:value-of select="$text"/></w:t>
            </w:r>
        </xsl:when>
        <xsl:otherwise>            
            <w:r>
                <w:t><xsl:value-of select="substring($text, 1, 1)"/></w:t>
            </w:r>
            <xsl:call-template name="tokenize">
                <xsl:with-param name="text" select="substring($text, 2, string-length($text)-1)"/>
            </xsl:call-template>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

不确定w:bookmarkStart和w:bookmarkEnd逻辑是如何工作的,但您可能可以从这里弄清楚。

票数 1
EN

Stack Overflow用户

发布于 2015-06-17 15:54:35

我可以想象到您会遇到两个错误(遗憾的是,您没有考虑告诉我们错误消息)。一个原因是tokenize函数不可用,这意味着您使用的是XSLT 1.0处理程序;另一个原因是您的正则表达式无效。

如果您使用的是XSLT2.0处理程序,那么可以使用string-to-codepoints()将字符串拆分成字符(并且可以使用codepoints to- string ()将每个字符转换为字符串)。

如果您使用的是XSLT 1.0处理程序,则需要按照@yarivt的建议使用递归模板“手动”进行拆分。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30880987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档