【问题标题】:Need XSL to Interpret Anchor Tags Inside XML String需要 XSL 来解释 XML 字符串中的锚标记
【发布时间】: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 页面时,我修改了第一个标题标签:&lt;title&gt;"&lt;a href='www.google.com'&gt;Empire Burlesque&lt;/a&gt;"&lt;/title&gt; 并注意到与我的 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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-06
      • 2018-05-18
      • 1970-01-01
      • 2017-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多