我在一个 XSLT 文档中处理两个 XML 文档,并尝试将要放入一个 HTML 文档的数据合并。
文档在一个点上匹配,即 id。id 将作为foo1.xml中汽车节点的属性找到。关于foo2.xml的 id 可以在 Data 节点中找到,它是第一个 Cell 节点的子节点(它是 Row 节点的子节点)。第一个 Cell 节点之后的 Cell 节点包含 Data 节点,其中包含所需的数据(颜色和条件)。
当在 XSLT 文档中将数据添加到 td 单元格时,我(以某种方式)需要在foo2.xml中找到正确的 id ,并在最后两个 td 中输入汽车的颜色和状况。
在下面的 XSLT 文档中,您可以看到我失败的尝试这样做。那么,如何做到这一点呢?
提前非常感谢!
注意:两个文件中 id 的顺序不同。
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>