需要 XSL 来解释 XML 字符串中的锚标记

Need XSL to Interpret Anchor Tags Inside XML String

问题

我正在使用 Apache FOP 从 XML 和 XSL 文件生成 PDF。 XML 文件是从外部站点下载的,不是我生成的,因此对它的任何操作都需要编写脚本。它包含的标签中包含锚 HTML 标签,这些标签旨在命名为 hyperlinks,但是 xsl:value-of 标签似乎以某种方式去除了字符串中锚标签的任何功能本身并使 PDF 报告具有锚点的显示文本,而不是 hyperlink,导致“单击此处”标签实际上不可单击,无法分辨 URL 是什么应该是因为 href 标签完全没了。

XML(片段)

<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(片段)

<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 生成步骤的问题,但是当我访问 w3Schools 页面的 XML/XSL xsl:value-of 标签时,我修改了第一个标题标签:<title>"<a href='www.google.com'>Empire Burlesque</a>"</title> 并注意到与我的 PDF 生成完全相同的行为:link 不起作用,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.

虽然与标记 links 相比,这有点草率,但 link 可以从 PDF 中单击并且可以工作,并且客户也可以 copy/paste URL 如果想要。

研究

我对此处和其他搜索的研究仅导致 XSL 文档内的 generation/handling 锚标记,而不是 XML 元素内的锚标记,需要由 XSL 将其解释为 hyper link。我找不到任何明确说明 xsl:value-of 使字符串内的锚标记无效的内容 returns,但这肯定是我所看到的。

这些 hyperlink 内嵌在 XML 元素内,XML 数据是通过脚本从外部网站作为报告的一部分下载的,所以我的 XSL 需要工作对于这些元素中包含的任何 hyperlinks(我 do 知道哪些可能包含 hyperlinks),而无需我手动编辑 XML (我可以用脚本来操作它,但手动操作是不可行的,因为这是从 XML/XSL 输入生成 PDF 报告的脚本的一部分)。

感谢任何可以提供一些见解或至少确认我正在尝试做的事情是不可能的人。如果我通过进一步研究发现任何内容,我将 post 进行任何编辑。

xsl:value-of 指令完全符合您的描述:它提取元素的字符串值,删除所有内部标记。

要保留现有标记不变,请使用 xsl:copy-of 指令。

要处理内部标记,将其转换成其他内容,请使用 xsl:apply-templates 指令,并使用适当的模板规则来处理遇到的后代元素。

最后,请不要将 w3schools 作为您的主要学习资源。当您了解语言的概念并需要提醒细节时,它作为快速参考非常方便。这不是最初学习概念的好方法。一旦您超出了基础知识并且需要对边缘情况的详细解释(它往往会简化),它也不是一个好去处。

注意:您说“我找不到任何明确说明 xsl:value-of 使字符串 it returns 内的锚标记无效的内容”。 w3schools 说“xsl:value-of 元素提取选定节点的值。”但是(通常)它没有说明“提取价值”的含义。但是,如果您转到 XSLT 1.0 规范 (https://www.w3.org/TR/xslt-10/#value-of),它会非常清楚:“实例化 xsl:value-of 元素以在结果树中创建文本节点。所需的 select 属性是一个表达式;这个表达式被评估,结果对象被转换为一个字符串,就像通过调用 string 函数一样。该字符串指定了创建的文本节点的字符串值。 xsl:value-of 创建文本节点的事实意味着(如果您了解树模型的概念)它不可能保留任何后代节点结构。