两个XML文档xpath xslt mapping

时间:2012-11-19 12:34:04

标签: xml xslt xpath

一直在努力让这个工作起来,但我必须遗漏一些东西。

我想通过两个文档中的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

2 个答案:

答案 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”标记值。它有效。