You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过XSL转换含双词典路径的XML文件生成统一词典

问题描述

我需要将包含logo路径及两个词典路径的XML文件转换为统一词典页面,目前已编写相关XSL文件但遇到瓶颈,不确定当前实现是否正确。

相关文件内容

lexicon.xml(主配置文件)

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="lexikon.xsl"?>
<lexicon>
    <wordlist1>xml_english.xml</wordlist1>
    <wordlist2>xml_swedish.xml</wordlist2>
    <editor>Simon Bale</editor>
    <logo>logo.svg</logo>
</lexicon>

瑞典语词典(xml_swedish.xml)

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="xml_style.css"?>
<wordlist
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation = "xsd_ordlista.xsd">
    <language>Svenska</language>
    <author>Karl Jonsson</author>
    <words>
        <word>natt</word>
        <word>dag</word>
        <word>vatten</word>
        <word>bil</word>
        <word>sol</word>
        <word>himmel</word>
        <word>stad</word>
        <word>hus</word>
        <word>katt</word>
        <word>regn</word>
    </words>
</wordlist>

英语词典(xml_english.xml)

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="xml_style.css"?>
<wordlist>
   <language>English</language>
   <author>David Cahill</author>
   <words>
      <word>night</word>
      <word>day</word>
      <word>water</word>
      <word>car</word>
      <word>sun</word>
      <word>sky</word>
      <word>city</word>
      <word>house</word>
      <word>cat</word>
      <word>rain</word>
   </words>
</wordlist>

当前使用的XSL文件(lexikon.xsl)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns="http://www.w3.org/TR/xhtml1/strict" >
    <xsl:output
            method="xml"
            indent="yes"
            encoding="iso-8859-1"
    />

    <xsl:template match="/">
        <html>
            <head>
                <title>Lexicon</title>
                <link rel="stylesheet" type="text/css" href="xml_style.css"/> 
            </head>
            <body>
                <image src="logo.svg" alt="Logo"/>
                <h1><xsl:value-of select="/wordlist/language"/>
                </h1>
                <h2><xsl:value-of select="/wordlist/author"/>
                </h2>
                <ul>
                    <xsl:for-each select="/wordlist/words/word">
                        <li>
                            <xsl:value-of select="."/>
                        </li>
                    </xsl:for-each>
                </ul>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

当前XSL的问题

  1. 上下文匹配错误:主文件根节点是<lexicon>,但代码直接查询/wordlist节点,该节点在主文件中不存在,导致无法获取词典内容
  2. Logo路径硬编码:没有从主文件的<logo>节点动态读取路径,无法适配路径变更
  3. 未加载外部词典:未使用document()函数加载wordlist1和wordlist2指向的外部XML文件,无法合并两个词典的内容

修改后的正确XSL文件

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns="http://www.w3.org/TR/xhtml1/strict">
    <xsl:output method="xml" indent="yes" encoding="iso-8859-1"/>

    <xsl:template match="/lexicon">
        <html>
            <head>
                <title>统一双语词典</title>
                <link rel="stylesheet" type="text/css" href="xml_style.css"/>
            </head>
            <body>
                <!-- 动态读取主文件中的logo路径 -->
                <img src="{logo}" alt="词典Logo"/>
                <h1>统一双语词典</h1>
                <p>编辑:<xsl:value-of select="editor"/></p>

                <!-- 遍历所有词典路径节点,加载外部词典 -->
                <xsl:for-each select="*[starts-with(local-name(), 'wordlist')]">
                    <!-- 使用document()加载外部XML文件 -->
                    <xsl:variable name="wordlist-doc" select="document(.)"/>
                    
                    <div class="dictionary-section">
                        <h2><xsl:value-of select="$wordlist-doc/wordlist/language"/></h2>
                        <h3>作者:<xsl:value-of select="$wordlist-doc/wordlist/author"/></h3>
                        <ul>
                            <xsl:for-each select="$wordlist-doc/wordlist/words/word">
                                <li><xsl:value-of select="."/></li>
                            </xsl:for-each>
                        </ul>
                    </div>
                </xsl:for-each>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

修改说明

  • 模板匹配主文件的根节点<lexicon>,确保上下文正确
  • 使用属性值模板{logo}动态读取主文件中的logo路径,替换硬编码内容
  • 通过document()函数加载每个wordlist*节点指向的外部词典文件,存入变量后读取内容
  • 使用starts-with(local-name(), 'wordlist')匹配所有词典路径节点,后续新增词典无需修改XSL,扩展性更强
  • 为每个词典生成独立展示区块,包含语言名称、作者和单词列表

内容的提问来源于stack exchange,提问作者Sunreuz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 10:55:54