我正在尝试解决Word的Office Open XML中丢失自定义XML的问题,但我遇到了一些问题。
我正在研究一种方法来跟踪对共享教案存储库的贡献,该存储库将驻留在Omeka网站上。
<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>我需要它看起来像这样:
<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><xsl:template match="w:t">
<xsl:value-of select="tokenize(., '.??')"/>
</xsl:template>我的假设是,这是因为函数没有实际的模式来进行标记化,因为我要求它在每个字符上分开。谢谢!
发布于 2015-06-17 10:17:44
您应该有一个用于此的模板,您可以将其应用于您的原始<w:t>值:
<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逻辑是如何工作的,但您可能可以从这里弄清楚。
发布于 2015-06-17 15:54:35
我可以想象到您会遇到两个错误(遗憾的是,您没有考虑告诉我们错误消息)。一个原因是tokenize函数不可用,这意味着您使用的是XSLT 1.0处理程序;另一个原因是您的正则表达式无效。
如果您使用的是XSLT2.0处理程序,那么可以使用string-to-codepoints()将字符串拆分成字符(并且可以使用codepoints to- string ()将每个字符转换为字符串)。
如果您使用的是XSLT 1.0处理程序,则需要按照@yarivt的建议使用递归模板“手动”进行拆分。
https://stackoverflow.com/questions/30880987
复制相似问题