将两个XML文件中的信息与一个XSL组合



我有两个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警告错误消息XY
模块名称消息描述DE
模块A
模块A3警告
模块B
模块B2费勒
模块B4Meldung 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()" />对它们进行排序。

相关内容

  • 没有找到相关文章

最新更新