1

1 つの XSLT ドキュメントで 2 つの XML ドキュメントを扱っており、データをマージして 1 つの HTML ドキュメントに入れようとしています。

ドキュメントは id という 1 点で一致します。id は、 foo1.xml内の car ノードの属性として見つかります。foo2.xmlに関しては、id は最初のセル ノード (行ノードの子) の子であるデータ ノード内にあります。この最初のセル ノードに続くセル ノードには、目的のデータ (色と状態) を含むデータ ノードが含まれます。

XSLT ドキュメントでデータが td セルに追加されると、(何らかの方法で) foo2.xmlで正しい ID を見つけ、最後の 2 つの td に車の色と状態を入力する必要があります。

以下の XSLT ドキュメントでは、これを実行しようとして失敗したことがわかります。では、どうすればこれを行うことができますか?

よろしくお願いします!

注: ID の順序は 2 つのファイルで同じではありません。

foo1.xml:

<cars>
  <car id="8">
    <brand>Saab</brand>
    <model>95</model>
    <year>2011</year>
  </car>
  <car id="57">
    <brand>Chrysler</brand>
    <model>Voyager</model>
    <year>2010</year>
  </cars>
  ...

foo2.xml:

<Table ss:ExpandedColumnCount="5" ss:ExpandedRowCount="79" x:FullColumns="1"
   x:FullRows="1" ss:DefaultColumnWidth="65" ss:DefaultRowHeight="15">
   <Column ss:Index="2" ss:AutoFitWidth="0" ss:Width="43"/>
   <Column ss:AutoFitWidth="0" ss:Width="113"/>
   <Column ss:Index="5" ss:AutoFitWidth="0" ss:Width="220"/>
   <Row ss:Index="6">
    <Cell ss:Index="3" ss:StyleID="s62"/>
   </Row>
   <Row>
    <Cell ss:Index="3" ss:StyleID="s62"/>
   </Row>
   <Row>
    <Cell ss:Index="3" ss:StyleID="s62"/>
   </Row>
   <Row>
    <Cell ss:Index="2"><Data ss:Type="String">57</Data></Cell>    // <-- where the id is to be found
    <Cell ss:StyleID="s62"><Data ss:Type="String">Yellow</Data></Cell>
    <Cell><Data ss:Type="String">New</Data></Cell>
   </Row>
   <Row>
    <Cell ss:Index="2"><Data ss:Type="Number">8</Data></Cell>    // <-- where the id is to be found
    <Cell ss:StyleID="s62"><Data ss:Type="Number">Black</Data></Cell>
    <Cell><Data ss:Type="Number">Used</Data></Cell>
   </Row>
   <Row>
    <Cell ss:Index="2"><Data ss:Type="Number">25</Data></Cell>    // <-- where the id is to be found
    <Cell ss:StyleID="s62"><Data ss:Type="Number">Blue</Data></Cell>
    <Cell><Data ss:Type="Number">Used</Data></Cell>
   </Row>
   ...

マージ.xsl:

   <- declarations... ->
         xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" >   <-- the XML namespace (ss:)

    <xsl:variable name="foo2" select="document('foo2.xml')" />

    <xsl:template match="/">
        <html>
            <head>
                <title>Cars</title>
            </head>
        <body>
            <xsl:apply-templates select="cars" />
        </body>  
        </html>
    </xsl:template>

    <xsl:template match="cars">

    <xsl:for-each select="$foo2//ss:Row">
        <xsl:value-of select="ss:Cell/ss:Data/text()" />
    </xsl:for-each>

    <table>
        <tr>
            <th>Id</th> <th>Brand</th> <th>Model</th> <th>Year</th> <th>Color</th> <th>Condition</th>
        </tr>
        <xsl:apply-templates select="car" />
    </table>
    </xsl:template>

    <xsl:template match="car">
        <xsl:variable name="id" select="data[2]/text()" />
            <tr>
                <td><xsl:value-of select="@id" /></td>
                <td><xsl:value-of select="brand" /></td>
                <td><xsl:value-of select="model" /></td>
                <td><xsl:value-of select="year" /></td>

                <td><xsl:value-of select="$positions//ss:Row/ss:Cell/ss:Data=@id/preceding-sibling::ss:Cell" /></td> <-- failed try (color)
                <td> ??? (Condition) </td>
            </tr>
    </xsl:template>
</xsl:stylesheet>
4

1 に答える 1

1

この変換:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:key name="kRowById" match="Row" use="Cell[1]/Data"/>

 <xsl:variable name="vDoc2" select="document('file:///c:/temp/delete/foo2.xml')"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="car">
  <xsl:variable name="vId" select="@id"/>
  <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     <xsl:for-each select="$vDoc2">
       <color><xsl:value-of select="key('kRowById', $vId)/Cell[2]/Data"/></color>
       <condition><xsl:value-of select="key('kRowById', $vId)/Cell[3]/Data"/></condition>
     </xsl:for-each>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

foo1.xml提供されたドキュメントに適用された場合:

<cars>
    <car id="8">
        <brand>Saab</brand>
        <model>95</model>
        <year>2011</year>
    </car>
    <car id="57">
        <brand>Chrysler</brand>
        <model>Voyager</model>
        <year>2010</year>
    </car>
</cars>

提供されたfoo2.xmlドキュメントが次の場所にある: c:\temp\delete:

    <Table xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
       xmlns:x="some:x"
       ss:ExpandedColumnCount="5" ss:ExpandedRowCount="79" x:FullColumns="1"
       x:FullRows="1" ss:DefaultColumnWidth="65" ss:DefaultRowHeight="15">
       <Column ss:Index="2" ss:AutoFitWidth="0" ss:Width="43"/>
       <Column ss:AutoFitWidth="0" ss:Width="113"/>
       <Column ss:Index="5" ss:AutoFitWidth="0" ss:Width="220"/>
       <Row ss:Index="6">
        <Cell ss:Index="3" ss:StyleID="s62"/>
       </Row>
       <Row>
        <Cell ss:Index="3" ss:StyleID="s62"/>
       </Row>
       <Row>
        <Cell ss:Index="3" ss:StyleID="s62"/>
       </Row>
       <Row>
        <Cell ss:Index="2"><Data ss:Type="String">57</Data></Cell>    // -- where the id is to be found
        <Cell ss:StyleID="s62"><Data ss:Type="String">Yellow</Data></Cell>
        <Cell><Data ss:Type="String">New</Data></Cell>
       </Row>
       <Row>
        <Cell ss:Index="2"><Data ss:Type="Number">8</Data></Cell>    // -- where the id is to be found
        <Cell ss:StyleID="s62"><Data ss:Type="Number">Black</Data></Cell>
        <Cell><Data ss:Type="Number">Used</Data></Cell>
       </Row>
       <Row>
        <Cell ss:Index="2"><Data ss:Type="Number">25</Data></Cell>    // -- where the id is to be found
        <Cell ss:StyleID="s62"><Data ss:Type="Number">Blue</Data></Cell>
        <Cell><Data ss:Type="Number">Used</Data></Cell>
       </Row>
</Table>

必要な正しいマージ出力を生成します

<cars>
   <car id="8">
      <brand>Saab</brand>
      <model>95</model>
      <year>2011</year>
      <color>Black</color>
      <condition>Used</condition>
   </car>
   <car id="57">
      <brand>Chrysler</brand>
      <model>Voyager</model>
      <year>2010</year>
      <color>Yellow</color>
      <condition>New</condition>
   </car>
</cars>

説明:

以下の適切な使用:

  1. document()関数。

  2. キー

  3. 現在の<xsl:for-each>ドキュメントを変更する命令。XSLT 1.0 では、key()関数は現在のドキュメントで動作します。

于 2012-11-20T22:38:00.030 に答える