最好用一个简短的例子来证明。
主 XML:
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
</cd>
<cd>
<title>Hide your heart</title>
<artist>Bonnie Tyler</artist>
</cd>
</catelo>
辅助 XML,我们称之为 localisation.es.xml
。
<?xml version="1.0" encoding="UTF-8"?>
<localisation lang="es">
<field id="title">Título</field>
<field id="artist">Artista</field>
</localisation>
所需的输出:
<html>
<table>
<thead>
<tr> <td>Título</td> <td>Artista</td> </tr>
</thead>
<tbody>
<tr> <td>Empire Burlesque</td> <td>Bob Dylan</td> </tr>
<tr> <td>Hide your heart</td> <td>Bonnie Tyler</td> </tr>
</tbody>
</table>
</html>
如您所见,数据来自主 XML 文件,而字段名称的本地化字符串来自辅助 XML。如何编写 XSLT 来处理此案?
此外,如果 XSLT 不知道这些字段怎么办?比如说,有人为主 XML 中的每条记录添加了一个新的字段<year>
,并在localisation.es.xml
中添加了一行:
<field id="year">Año</field>
是否可以在不修改 XSLT 文件的情况下生成所需的输出?
谢谢。
这可以使用查找表来完成,这需要 XSLT 2.0。
在 xslt 中,您将创建一个键和一个包含查找表的变量(在本例中为本地化文件)。每当您需要查找表中的文件时,都可以使用该键搜索正确的值。
所以首先定义变量和键。
<xsl:variable name="localisation" select="document('localisation.es.xml')"/>
<xsl:key name="locKey" match="localisation/field" use="@id"/>
然后,当您需要查找标题的字符串时,您将按如下方式选择它
<xsl:value-of select="key('locKey', 'title', $lookup)"/>