在Symphony CMS中,我希望能够拥有一个包含页面内容的XML文档(可能使用DocBook)和另一个XML文档,该文档是中央首字母缩略词/缩写存储库。例如,此存储库可能如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="../utilities/master.xsl"?>
<terminology>
<abbreviations>
<term abbr="World Wildlife Fund">WWF</term>
</abbreviations>
</terminology>
然后,XSL 文档将使用 XPath 执行转换,以在模板中显示 DocBook XML。
例如,在从 DocBook 输出的副本中包含文本"WWF",每当发生这种情况时,XSLT 和 XPath 都会使用缩写词/缩写存储库作为资源,将该单词与标题一起包装起来。
<abbr title="World Wildlife Fund">WWF</abbr>
整个设置需要具有足够的可扩展性,以便在存储库中包含一大堆术语,每当在 DocBook 内容中看到某个文本字符串时,都可以调用这些术语。
我被指出了HTML忍者技术的方向,这听起来好像它会为我提供我需要的东西,但是这个例子是拉入HTML(这似乎有点奇怪),并没有详细说明如何对我想要生成的文本字符串执行这种操作。
值得注意的是,我一直在尝试在Symphony Utilities的master.xsl模板中执行此操作。如果这在此文件中不起作用,我很高兴得到纠正。
我对 XSLT 和 XPath 很陌生,所以在回答这个问题时请不要假设我的任何知识。此时,我什至正在努力连接XML和XLS文档。将不胜感激,提供分步说明,让我生成概念验证。
假设我在同一位置有 3 组文件。
-
页面文档 (XML)。
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="transform.xsl"?> <html> <span>WWF1</span> <span>WWF</span> <span>WWF2</span> </html>
-
首字母缩略词存储库 (XML)
<?xml version="1.0"?> <terminology> <abbreviations> <term abbr="World Wildlife Fund 1">WWF1</term> <term abbr="World Wildlife Fund 2">WWF2</term> </abbreviations> </terminology>
-
转换器 (XSL)。
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output indent="yes" method="xml"/> <xsl:template match="/"> <xsl:apply-templates select="html" mode="transform"> <xsl:with-param name="repository" select="document('repository.xml')/terminology"/> </xsl:apply-templates> </xsl:template> <!-- Updated Template Start--> <xsl:template match="text()" mode="transform" priority="2.5"> <xsl:param name="repository" /> <xsl:variable name="this" select="." /> <xsl:variable name="term" select="$repository/abbreviations/term[contains($this,./text())]" /> <xsl:choose> <xsl:when test="count($term) > 0"> <xsl:value-of select="substring-before(., $term/text())"/> <xsl:variable name="termTitle" select="$term/@abbr" /> <abbr title="{$termTitle}"><xsl:value-of select="$term/text()"/></abbr> <xsl:value-of select="substring-after($this, $term/text())"/> </xsl:when> <xsl:otherwise> <xsl:copy-of select="."/> </xsl:otherwise> </xsl:choose> </xsl:template> <!-- Updated Template Stop--> <xsl:template match="node()" mode="transform" priority="2"> <xsl:param name="repository" /> <xsl:copy> <xsl:apply-templates mode="transform"> <xsl:with-param name="repository" select="$repository"/> </xsl:apply-templates> </xsl:copy> </xsl:template> </xsl:stylesheet>
转换器文件将提供如下所示的输出。
<html>
<span><abbr title="World Wildlife Fund 1">WWF1</abbr></span>
<span>WWF</span>
<span><abbr title="World Wildlife Fund 2">WWF2</abbr></span>
</html>
您可以通过简单地添加另一个节点来缩放首字母缩略词。
XSLT 不需要更改。
我希望这对你有所帮助。