1

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

XML 片段:

<?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!!!  - &lt;/Message>
    </SMSMessage>
</SMSExport>

XML 片段:

<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 块片段:

<fo:block start-indent=".35in" end-indent=".25in" keep-with-next="always">
    Yay!!! ;-) - ;-);-);-)
        <fo:block/>
    Yay!!!  -
</fo:block>

提前致谢!

补充:(使用 LarsH 的回答,这是我处理递归的方式。希望它可以帮助其他人。

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

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

而不是我想要的,这是:

This is the result of (x.gif)(y.gif)(z.gif).

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

<xsl:copy-of select="."/>

行,嵌套下一个分析块(在本例中,我还用它的十六进制值替换了表情符号字符,以避免出现空框)。我在这里只为两个项目/级别完成了它,但你只需继续嵌套,它就很好用:

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

2 回答 2

3

replace()函数用字符串替换出现的模式。的字符串值$emoji是其文本节点的串联——即空字符串。换句话说,replace()不能做你需要的。

问题归结为,如何用 XML 片段替换字符串中的字符(或模式)?

一个好的解决方案是用xsl:analyze-string完整的结构化内容替换出现的模式“” $emoji

<xsl:analyze-string select="following-sibling::Message" regex="">
  <xsl:matching-substring>
    <xsl:copy-of select="$emoji" />
  </xsl:matching-substring>
  <xsl:non-matching-substring>
    <xsl:value-of select="."/>
  </xsl:non-matching-substring>
</xsl:analyze-string>

而不是 using <xsl:value-of>,它只能输出文本。

于 2011-12-05T23:21:37.553 回答
0

如果您使用的是 XSLT 2.0,字符映射提供了一种更简单的方法来完成您想要的操作。XSLT 2.0 规范的相关部分有一个示例,其中包括为特定字符提供 HTML img 元素。

于 2013-06-20T02:29:07.387 回答