一直在努力让这个工作起来,但我必须遗漏一些东西。
我想通过两个文档中的id将两个XML文档映射到一起。 我可以使用一个XSLT从两个文档中获取数据输出,但我不知道如何映射它们。
第一个xml:
...
<member>
<id>1</id>
<name>John</name>
</member>
<member>
<id>2</id>
<name>Otto</name>
</member>
...
第二个xml :( ss名称空间)
...
<row>
<cell ss:Type="String">id</cell>
<cell ss:Type="String">Number 1</cell>
<cell ss:Type="String">Number 2</cell>
</row>
<row>
<cell ss:Type="Number">1</cell>
<cell ss:Type="Number">1231312313</cell>
<cell ss:Type="Number">234234234342</cell>
</row>
<row>
<cell ss:Type="Number">2</cell>
<cell ss:Type="Number">4353453453</cell>
<cell ss:Type="Number">345345345455</cell>
</row>
...
我遍历XSLT文件中的name和id元素,并且在这个循环中我试图使用apply模板将值映射到第二个xml中的id。
最终的HTML输出应该类似于:
Id Name Number 1 Number 2
1 John 1231312313 234234234342
2 Otto 4353453453 345345345455
答案 0 :(得分:0)
以下可能是一个起点:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0" xmlns:ss="NS:SS">
<xsl:template match="/">
<html>
<table>
<xsl:apply-templates/>
</table>
</html>
</xsl:template>
<xsl:template match="*">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="ss:row">
<tr>
<xsl:apply-templates/>
</tr>
</xsl:template>
<xsl:template match="ss:cell">
<td><xsl:value-of select="."/></td>
</xsl:template>
<xsl:template match="ss:cell[1]">
<xsl:variable name="id" select="string()"/>
<td><xsl:value-of select="$id"/></td>
<!-- Especially for large amounts of data, making use of key() would be better than "//"
The key() call can be wrapped inside a <xsl:for-each select="document('firstDocument.xml')>
that changes the context to the other document -->
<td><xsl:value-of select="document('firstDocument.xml')//member[id=$id]/name"/></td>
</xsl:template>
</xsl:stylesheet>
这必须应用于您所谓的第二个文档。使用document()
函数调用第一个文档。
正如Martin Honnen指出的那样,使用key()
会更好(特别是如果你有大型数据集)。请参阅有关将对key()
的调用包装到<xsl:for-each>
的注释,以使其在XSLT 1.0中正常工作。
答案 1 :(得分:0)
我用call-template“function”解决了它,并将id的值作为参数传递。然后使用for-each和if-statement选取第二个文件中的“Number”标记值。它有效。