【发布时间】:2021-10-14 03:30:34
【问题描述】:
问题
我正在使用 Apache FOP 从 XML 和 XSL 文件生成 PDF。 XML 文件是从外部站点下载的,不是由我生成的,因此对它的任何操作都需要编写脚本。它包含在其中包含锚定 HTML 标签的标签,旨在命名为超链接,但 xsl:value-of 标签似乎以某种方式剥离了字符串本身内部锚定标签的任何功能,并使 PDF 报告具有显示文本锚点,而不是超链接,导致“单击此处”标签实际上不可点击,因为 href 标记已完全消失,因此无法判断 URL 应该是什么。
XML (sn-p)
<SOLUTION>See the <A HREF="https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html" TARGET="_blank">Cheat Sheet</A> for more information.</SOLUTION>
XSL (sn-p)
<fo:block line-height="15pt" font-size="10pt" start-indent="2em" linefeed-treatment="preserve">
<xsl:value-of select="SOLUTION" />
</fo:block>
结果
PDF 输出包含锚标记内的文本,但 href 完全丢失且不显示。我想这可能是 Apache FOP 和 PDF 生成步骤的问题,但是当我访问 XML/XSL xsl:value-of 标签的 w3Schools 页面时,我修改了第一个标题标签:<title>"<a href='www.google.com'>Empire Burlesque</a>"</title> 并注意到与我的 PDF 生成完全相同的行为:链接不起作用,href 属性完全消失。
w3schools 示例:https://www.w3schools.com/xml/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog_ex2
解决方法
现在,我将用 CDATA 标记包围有问题的元素的字符串值。这会导致 PDF 包含以下文本(纯文本 - 您会看到标签):
See the <A HREF="https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html" TARGET="_blank">Cheat Sheet</A> for more information.
虽然与带有标签的链接相比,这有点草率,但可以从 PDF 中单击链接并且可以正常工作,并且如果需要,客户还可以复制/粘贴 URL。
研究
我对此处和其他搜索的研究仅导致在 XSL 文档中生成/处理锚标记,而从未在 XML 元素中生成/处理,并且需要由 XSL 将其解释为超链接。我找不到任何明确说明 xsl:value-of 在它返回的字符串中使锚标记无效的内容,但这似乎就是我所看到的。
这些超链接内嵌在 XML 元素中,并且 XML 数据是通过脚本下载的,作为来自外部网站的报告的一部分,因此我的 XSL 需要适用于这些元素中包含的任何超链接(我 这样做 em> 知道哪些可能包含超链接),而无需我手动编辑 XML(我可以使用脚本对其进行操作,但手动操作是不可行的,因为这是从 XML/XSL 输入生成 PDF 报告的脚本的所有部分)。
感谢任何可以提供一些见解或至少确认我正在尝试做的事情是不可能的人。如果我通过进一步研究发现任何内容,我会发布任何修改。
【问题讨论】:
标签: xml xslt apache-fop