首页 > 解决方案 > 在 XQuery 中构建动态 XSLT - 使用传递给参数的 HTML

问题描述

在 XQuery 3.1 中,我动态地创建了一个 XSLT 2.0 样式表来将tei-xml文档转换为 HTML。

在 XQuery 中,我创建了一个变量$docdate来存储 HTML 跨度:

<span><a href="somefoosite.com">2018-12-10</a></span>

然后我将它传递给 XSLT 样式表中的一个参数,然后使用它:

let $stylesheet := 
           <xsl:stylesheet>
              [....]
              <xsl:param name="paramDocdate" as="element()*">{$docdate}</xsl:param>
              [....]
              <xsl:apply-templates select="$paramDocdate" mode="date"/>
              [....]
           </xsl:stylesheet>

我不确定xsl:apply-templates如何让 HTML 呈现为 HTML,而不仅仅是输出 text 2018-12-10。需要明确的是:HTML 元素肯定是通过参数来的,而不仅仅是text().

或者,我想在 XQuery 中创建变量时,可以以某种方式将 HTML 序列化为字符串(作为长字符串传递给参数)?

但我无法弄清楚如何做这两件事。

我宁愿避免在创建时直接将 HTML 手动编写为字符串$docdate……如果可以以编程方式执行此操作。

提前谢谢了。

编辑:原来这个模板从参数输出HTML,但我有兴趣听到其他方法来解决这个问题......

 <xsl:template match="span" mode="date">
    <xsl:copy-of select="."/>
 </xsl:template>

标签: xslt-2.0xquery-3.0

解决方案


如果您知道您有一个具有正确名称和名称空间的元素(例如span,对于 HTML 4 或 HTML5 没有名称空间,或者span对于 XHTML 有 XHTML 名称空间)并且只想将其复制到您根本不需要的输出apply-templates中,您可以直接使用<xsl:copy-of select="$paramDocdate"/>

但是,如果您使用apply-templates那么显然您需要确保有一个模板可以完成您需要的正确工作(即复制),因此,正如您所发现的那样,span在想要的模式下设置模板以复制或设置通用模板就像xsl:template mode="#all"执行复制的那个模式(或所有模式)的身份转换。


推荐阅读