【发布时间】:2017-04-10 10:40:07
【问题描述】:
我有这样结构的 XML 文件-
<products>
<product>
<id>1</id>
<type>fruits</type>
<varieties>
<variety>
<id>a</id>
<cost>100</cost>
<availability>Y</availability>
</variety>
<variety>
<id>b</id>
<cost>75</cost>
<availability>N</availability>
</variety>
</varieties>
</product>
<product>
<id>2</id>
<type>vegetables</type>
<varieties>
<variety>
<id>c</id>
<cost>50</cost>
<availability>Y</availability>
</variety>
<variety>
<id>d</id>
<cost>55</cost>
<availability>Y</availability>
</variety>
</varieties>
</product>
</products>
我想根据产品/产品/id 重构给定的 XML。预期输出如下-
<html>
<body>
<table border="1">
<tr>
<td>1</td>
<td>fruits</td>
<td>a</td>
<td>100</td>
<td>Y</td>
</tr>
<tr>
<td>1</td>
<td>fruits</td>
<td>b</td>
<td>75</td>
<td>N</td>
</tr>
<tr>
<td>2</td>
<td>vegetables</td>
<td>c</td>
<td>50</td>
<td>Y</td>
</tr>
<tr>
<td>2</td>
<td>vegetables</td>
<td>d</td>
<td>55</td>
<td>Y</td>
</tr>
</table>
</body>
</html>
我已经尝试过这个 XSLT,但它没有返回预期的 xml。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<products>
<product>
<varieties>
<xsl:apply-templates select="products/product/varieties/variety" />
</varieties>
</product>
</products>
</xsl:template>
<xsl:template match="products" >
<html>
<body>
<table border="1">
<xsl:for-each select="products/product">
<tr>
<td><xsl:value-of select="id" /></td>
<td><xsl:value-of select="type" /></td>
<xsl:for-each select="varieties/variety" >
<td><xsl:value-of select="id" /></td>
<td><xsl:value-of select="cost" /></td>
<td><xsl:value-of select="availability" /></td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
【问题讨论】:
-
您正在将模板应用于“variety” - 但您没有与
variety匹配的模板。您有一个匹配root的模板 - 但没有名为root的元素。并且匹配/(这是唯一被执行的模板)的模板的内容与您的预期输出不匹配。 -
另请注意,XML 区分大小写:
variety与Variety不匹配。 -
嗨@michael.hor257k 我已经修改了我的XSLT。能否请您提出更改建议?
-
没有。这确实是一项微不足道的任务。为每个
variety创建一行,并使用<xsl:value-of select="../../id" />和<xsl:value-of select="../../type"/>分别获取祖先产品的id和type。