如何让 XSLT 和 XPath 在 Symphony CMS 中以精细的 HTML 操作输出 XML



在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 组文件。

  1. 页面文档 (XML)。

    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="transform.xsl"?>
    <html>
        <span>WWF1</span>
        <span>WWF</span>
        <span>WWF2</span>
    </html>
    
  2. 首字母缩略词存储库 (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>
    
  3. 转换器 (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 不需要更改。

我希望这对你有所帮助。

相关内容

  • 没有找到相关文章

最新更新