我见过类似的,但不完全是这样的问题,但这就是我想要做的。我有来自我的 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!!! - </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="">
<xsl:matching-substring>
<xsl:copy-of select="$E057"/>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:analyze-string select="." regex="">
<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>