0

これを機能させるために何時間も努力してきましたが、何かが足りないに違いありません。

2つのXMLドキュメントを両方のドキュメントのIDで一緒にマップしたいと思います。1つのXSLTを使用して両方のドキュメントからデータ出力を取得できますが、それらをマップする方法がわかりません。

最初のxml:

...
<member>
  <id>1</id>
  <name>John</name>
</member>
<member>
  <id>2</id>
  <name>Otto</name>
</member>
...

2番目の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要素をループし、このループ内で、適用テンプレートを使用して2番目のxmlのidにマップする値を取得しようとしています。

最終的なHTML出力は次のようになります。

Id      Name          Number 1         Number 2
1       John          1231312313       234234234342
2       Otto          4353453453       345345345455
4

2 に答える 2

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>

これは、2番目のドキュメントと呼ばれるものに適用する必要があります。最初のドキュメントは、document()関数を使用して呼び出されます。

Martin Honnenが指摘しているように、使用key()する方が良いでしょう(特に大きなデータセットがある場合)。XSLT 1.0でこれを機能させるために、key()への呼び出しをラップすることについてのコメントを参照してください。<xsl:for-each>

于 2012-11-19T15:35:57.063 に答える
0

call-template "function"で解決し、idの値をパラメーターとして渡しました。次に、for-eachとifステートメントを使用して2番目のファイルの「Number」タグの値を取得します。できます。

于 2012-11-20T12:23:02.113 に答える