我有两个XML文件,其中包含不同的信息:
example.xml
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="stylesheet.xsl"?>
<root>
<Module Name="Module A">
<Message>1</Message>
<Message>3</Message>
</Module>
<Module Name="Module B">
<Message>1</Message>
<Message>2</Message>
<Message>4</Message>
</Module>
</root>
和
messages.xml
<?xml version="1.0" encoding="utf-8"?>
<messages>
<message number="1">
<description en="Message One" de="Meldung Eins" />
</message>
<message number="2">
<description en="Error" de="Fehler" />
</message>
<message number="3">
<description en="Warning" de="Warnung" />
</message>
<message number="4">
<description en="Message XY" de="Meldung XY" />
</message>
</messages>
现在我已经创建了一个XSL文件来组合信息
stylesheet.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>Messages</h2>
<table border="1">
<tr bgcolor="#d3d3d3">
<th>Module Name</th>
<th>Message</th>
<th>Description EN</th>
<th>Description DE</th>
</tr>
<xsl:for-each select="//Message">
<tr>
<xsl:variable name="num">
<xsl:value-of select="."/>
</xsl:variable>
<td>
<xsl:value-of select="../@Name"/>
</td>
<td>
<xsl:value-of select="."/>
</td>
<xsl:for-each select="document('messages.xml')//message">
<xsl:choose>
<xsl:when test="$num = @number">
<td>
<xsl:value-of select="description/@en"/>
</td>
<td>
<xsl:value-of select="description/@de"/>
</td>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
并得到这样的输出
模块名称 | 消息 | 描述EN描述DE | |
---|---|---|---|
模块A | |||
模块A | 3 | 警告 | 警告|
模块B | |||
模块B | 2 | 错误费勒 | |
模块B | 4 | 消息XYMeldung XY |
如果只使用这两个值,则不需要分别使用。为文档定义一个变量,在中为每个变量定义一个,并通过XPath访问错误消息文本(如注释中所述(:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="docMsg" select="document('messages.xml')//message" />
...
<xsl:for-each select="//Message">
<tr>
<xsl:variable name="num" select="." />
<td>
<xsl:value-of select="../@Name"/>
</td>
<td>
<xsl:value-of select="."/>
</td>
<td>
<xsl:value-of select="$docMsg[@number=$num]/description/@en"/>
</td>
<td>
<xsl:value-of select="$docMsg[@number=$num]/description/@de"/>
</td>
</tr>
</xsl:for-each>
但若你们想迭代所有的属性,你们可以使用for each:
<xsl:for-each select="//Message">
<tr>
<xsl:variable name="num" select="." />
<td>
<xsl:value-of select="../@Name"/>
</td>
<td>
<xsl:value-of select="."/>
</td>
<xsl:for-each select="$docMsg[@number=$num]/description/@*">
<td>
<xsl:value-of select="."/>
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
这将对<description>
的所有属性进行迭代(每个属性一列(。但请注意,属性在元素中的顺序必须始终相同。如果它们不是,你可以在它们的内部用一个<xsl:sort select="local-name()" />
对它们进行排序。