目前,我的文件中有很多“xsl:choose”条件 - 一个字母只有一个“xsl:choose”,而且效果很好。 我试图通过用“for-each”循环替换许多“xsl:choose”来简化这种情况 - 但是没有运气。
在我看来,'for-each'里面的count()总是返回0。 我很好奇,因为没有'for-each'的相同count()工作正常。
请帮助。
<?xml version="1.0"?>
<stocks>
<names date="10/30/2013" time="20:37:12">
<name>WGOS1</name>
<name>WGOS2</name>
<name>WGOS3</name>
<name>WGOS4</name>
<name>WGOS5</name>
</names>
<loc>
<slot>P</slot>
<slot>P</slot>
<slot>P</slot>
<slot>P</slot>
<slot>H</slot>
<slot>S</slot>
</loc>
<loc>
<slot>P</slot>
<slot>P</slot>
<slot>P</slot>
<slot>S</slot>
当我使用'count'函数来计算值时,例如。 'loc'节点中的'B',它可以正常工作
<xsl:variable name="color-table">
<var code="A">pink</var >
<var code="B">silver</var>
<var code="P">red</var>
<var code="D">pink</var>
<var code="H">yellow</var>
<var code="S">lightblue</var>
<var code="T">green</var>
<var code="W">pink</var>
</xsl:variable>
<xsl:template match="/">
<xsl:choose>
<xsl:when test="count(/stocks/loc[$pos]/slot [. eq 'B']) > 0">
<td class="slot-B">
<xsl:value-of select="count(/stocks/loc[$pos]/slot [. eq 'B'])"/>
<xsl:text>B</xsl:text>
</td>
</xsl:when>
</xsl:choose>
但是当我尝试在每个循环内部执行相同操作时 - 测试条件失败,因为count()结果始终为0.。
<xsl:for-each select="$color-table/var">
<xsl:variable name="p" select="@code"/>
<xsl:choose>
<xsl:when test="count(/stocks/loc[$pos]/slot [. eq $p]) > 0">
<td class="slot-$p">
<xsl:value-of select="count(/stocks/loc[$pos]/slot [. eq $p])"/>
<xsl:value-of select="$p"/>
</td>
</xsl:when>
</xsl:choose>
</xsl:for-each>
答案 0 :(得分:1)
$color-table
变量引用临时树,所以当你在
<xsl:for-each select="$color-table/var">
/
是该临时树的根,而不是原始文档的根,因此/stocks/loc[$pos]/slot
将找不到任何节点。
在进入/
之前,您需要将外部for-each
存储在另一个变量中。
<xsl:variable name="slash" select="/" />
<xsl:for-each select="$color-table/var">
<xsl:variable name="p" select="@code"/>
<xsl:choose>
<xsl:when test="count($slash/stocks/loc[$pos]/slot [. eq $p]) > 0">
<td class="slot-{$p}">
<xsl:value-of select="count($slash/stocks/loc[$pos]/slot [. eq $p])"/>
<xsl:value-of select="$p"/>
</td>
</xsl:when>
</xsl:choose>
</xsl:for-each>
但是,不是迭代颜色表,而是通过插槽本身for-each-group
可能更有效
<xsl:for-each-group select="/stocks/loc[$pos]/slot" group-by=".">
<td class="slot-{current-grouping-key()}">
<xsl:value-of select="count(current-group())" />
<xsl:value-of select="current-grouping-key()" />
</td>
</xsl:for-each-group>