如何通过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的问题
- 上下文匹配错误:主文件根节点是
<lexicon>,但代码直接查询/wordlist节点,该节点在主文件中不存在,导致无法获取词典内容 - Logo路径硬编码:没有从主文件的
<logo>节点动态读取路径,无法适配路径变更 - 未加载外部词典:未使用
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
相关产品推荐
相关产品推荐

