以下是我的代码情况的描述。实际问题可能会缩小到您在标题中找到的问题,这些信息会在帖子末尾找到。但是myabe我正朝着错误的方向寻找,所以:
这是给定的结构,它是转换为xml的mysql表的内容。
<result>
<row>
<col>..</col>
</row>
<row>
<col>..</col>
</row>
<row>
<col>..</col>
</row>
<row>
<col>..</col>
</row>
[..]
</result>
现在我正在尝试编写一个xsl文件,其中包含有关如何显示这些结构的信息。
基本上,它看起来像这样:<xsl:template match="//result">
<table>
<xsl:apply-templates/>
</table>
</xsl:template>
<xsl:template match="//result/row">
<tr>
<xsl:apply-templates/>
</tr>
</xsl:template>
<xsl:template match="//result/row/col">
<td>
<xsl:value-of select="."/>
</td>
</xsl:template>
这是有效的,但现在我的困难是要使描述更加可变,它不应该总是“表”,有时我需要div或任何其他html代码来“渲染”表的每个部分。
所以我决定在xml文件的另一部分标记这个,如下所示:
<display>
<MyTable>
<MyRow>
<MyCol/>
</MyRow>
</MyTable>
</display>
它看起来也像这样:
<display>
<MyDiv>
<MyDivSub>
<MyDivSubSub/>
</MyDivSub>
</MyDiv>
</display>
但是,这些声明在xsl文件中定义如下:
<xsl:template match="//display/MyTable">
<table>
<xsl:apply-templates/>
</table>
</xsl:template>
<xsl:template match="//display/MyTable/MyRow">
<tr>
<xsl:apply-templates/>
</tr>
</xsl:template>
<xsl:template match="//display/MyTable/MyRow/MyCol">
<td>
<xsl:value-of select="."/>
</td>
</xsl:template>
现在,我的计划是为result,row,col设计模板,它们只调用在xml文件的display元素中指定的模板。这甚至可能是这样的:
<xsl:template match="//result">
<xsl:apply-templates select="//Display/*">
</xsl:template>
<xsl:template match="//result/row">
<xsl:apply-templates select="//Display/*/*">
</xsl:template>
<xsl:template match="//result/row/col">
<xsl:apply-templates select="//Display/*/*/*">
</xsl:template>
当然,此时这不起作用,因为应用模板在它们内部应用模板时不会返回到结果。相反,他们将它们应用于显示部分。这可以通过参数的传输来解决。我试过这个,它有效。但对我来说,包含最终描述信息的模板(如MyTable,MyRow ..)与这些额外的行没有“混淆”是至关重要的。后来他们可能变得相当复杂,可能会有很多这样的,所以我希望他们的基本结构尽可能小。换句话说:我正在寻找的神奇功能就是这个,放在描述模板中:
<xsl:template match="//display/MyTable">
<table>
<xsl:"GO BACK TO THE TEMPLATE THAT CALLED YOU"/>
</table>
</xsl:template>
有这样的功能,还是有人知道我关心的任何其他解决方案?或者我必须接受params的解决方案?我无法相信,因为实际上并不是一个如此复杂的程序。
我希望我很清楚,如果有任何问题,请问。米。
答案 0 :(得分:0)
我真的不认为为了传递参数而增加一条线就会“弄乱它们”。我认为没有办法完成你所描述的内容,即使有,也没有意义。不会回到调用模板只会导致无限循环?
以下是否存在严重问题?我认为它非常干净灵活:
<xsl:template match="MyTable">
<xsl:param name="context" select="/.." />
<table>
<xsl:apply-templates select="$context/node()" />
</table>
</xsl:template>
<xsl:template match="MyRow">
<xsl:param name="context" select="/.." />
<tr>
<xsl:apply-templates select="$context/node()" />
</tr>
</xsl:template>
<xsl:template match="MyCol">
<xsl:param name="context" select="/.." />
<td>
<xsl:value-of select="$context"/>
</td>
</xsl:template>
<xsl:variable name="display" select="(//display)[1]" />
<xsl:template match="result">
<xsl:apply-templates select="$display/*">
<xsl:with-param name="context" select="." />
</xsl:apply-templates>
</xsl:template>
<xsl:template match="result/row">
<xsl:apply-templates select="$display/*/*">
<xsl:with-param name="context" select="." />
</xsl:apply-templates>
</xsl:template>
<xsl:template match="result/row/col">
<xsl:apply-templates select="$display/*/*/*">
<xsl:with-param name="context" select="." />
</xsl:apply-templates>
</xsl:template>