首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在XSLT / FO中将字符替换为图形(表情符号)?

如何在XSLT / FO中将字符替换为图形(表情符号)?
EN

Stack Overflow用户
提问于 2011-12-06 06:03:26
回答 2查看 1.3K关注 0票数 1

我见过类似的问题,但不完全是像这样的问题,但这是我想要做的。我有我的SMS中的XML,并从中创建了一个PDF日志。效果很好。我尝试添加这个新元素,并且在XSLT中使用了" replace“函数来替换字符,但是我想使用一个变量放入一个外部图形。如果我将XSLT变量的内容直接粘贴到FO文档中,它会生成没有问题的PDF,但我不会将标记和内容传递到FO文件中。我猜我错过了一些简单的东西。

XML代码片段:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<SMSExport>
    <SMSMessage>
        <Kind>Sent</Kind>
        <DateTime>2011-11-08 12:14:23 -0800</DateTime>
        <Name>Sendee's name</Name>
        <Number>+15553009008</Number>
        <Message>Yay!!!  - </Message>
    </SMSMessage>
</SMSExport>

XML代码片段:

代码语言:javascript
运行
复制
<xsl:if test="not(following-sibling::Message/@File)">
    <!-- Needs rework!!!  "Graphic not taking -->
    <xsl:variable name="emoji">
        <fo:external-graphic src="emoji/emoji-E057.png"
            content-height=".15in"/>
    </xsl:variable>
        <!-- Repeat added, to show a string replace works -->
    <xsl:value-of select="replace(following-sibling::Message, '', ';-)')"/>
        <fo:block/>
    <xsl:value-of select="replace(following-sibling::Message, '',$emoji)"/>
</xsl:if>

给出生成的FO块片段:

代码语言:javascript
运行
复制
<fo:block start-indent=".35in" end-indent=".25in" keep-with-next="always">
    Yay!!! ;-) - ;-);-);-)
        <fo:block/>
    Yay!!!  -
</fo:block>

提前感谢!

附加:(使用LarsH的答案,这是我处理递归的方式。希望能对其他人有所帮助。

为了递归处理字符串,我一直在上面的块中粘贴,并使用一个新的正则表达式。这是放置分析的单独实例,所以我不断地重复这一行,每个新项都被替换。也就是说,使用三个块,搜索三个项目(X,Y,Z):

代码语言:javascript
运行
复制
This is the result of (x.gif)YZ.
This is the result of X(y.gif)Z.
This is the result of XY(z.gif).

而不是我想要的是:

代码语言:javascript
运行
复制
This is the result of (x.gif)(y.gif)(z.gif).

对于其他情况,要处理此问题,只需替换不匹配的

代码语言:javascript
运行
复制
<xsl:copy-of select="."/>

代码行,嵌套下一个analyze块(在本例中,我还用颜文字字符的十六进制值替换了它,以避免出现空框)。我在这里只做了两个项目/级别,但你可以继续嵌套,它工作得很好:

代码语言:javascript
运行
复制
<xsl:analyze-string select="following-sibling::Message" regex="&#xE057;">
    <xsl:matching-substring>
        <xsl:copy-of select="$E057"/>
    </xsl:matching-substring>
    <xsl:non-matching-substring>
        <xsl:analyze-string select="." regex="&#xE120">
            <xsl:matching-substring>
                <xsl:copy-of select="$E120"/>
            </xsl:matching-substring>
            <xsl:non-matching-substring>
                <xsl:copy-of select="."/>
            </xsl:non-matching-substring>
        </xsl:analyze-string>
     </xsl:non-matching-substring>
</xsl:analyze-string>
EN

Stack Overflow用户

发布于 2013-06-20 10:29:07

如果您使用的是XSLT 2.0,字符映射提供了一种更简单的方法来完成您想要做的事情。relevant section of the XSLT 2.0 spec有一个示例,其中包括为特定字符提供HTML img元素。

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

https://stackoverflow.com/questions/8392517

复制
相关文章

相似问题

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