1

在 Symphony CMS 中,我希望能够拥有一个包含页面内容(可能使用 DocBook)的 XML 文档和另一个作为中央首字母缩写词/缩写存储库的 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 Ninja Technique的方向,这听起来好像它会为我提供我需要的东西,但是这个例子是在提取 HTML(这似乎有点奇怪)并且没有详细介绍如何执行对我要生成的文本字符串进行某种操作。

值得注意的是,我一直在尝试在 Symphony Utilities 的 master.xsl 模板中执行此操作。如果这在此文件中不起作用,我很高兴得到纠正。

我对 XSLT 和 XPath 很陌生,所以在回答这个问题时请不要假设我的任何知识。此时我什至在努力连接 XML 和 XLS 文档。让我制作概念证明的分步说明将不胜感激。

4

1 回答 1

1

假设我在同一位置有 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 不需要更改。

我希望这可以帮助你。

于 2012-07-01T14:13:15.157 回答