我是xsl的新手并遇到以下问题:
有像
这样的XML<data>
<row FilterValue1="1" Value2="2" FilterValue3="3" />
<row FilterValue1="a" Value2="b" FilterValue3="c" />
</data>
<features>
<row title="Feature 1" provideFilter="yes" />
<row title="Feature 2" provideFilter="no"/>
<row title="Feature 3" provideFilter="yes">
</features>
根据'provideFilter',我想创建一个下拉列表,如
<label for="Value1">Feature 1</label>
<select id="Value1">
<option>1</option>
<option>a</option>
</select>
<label for="Value3">Feature 3</label>
<select id="Value3">
<option>3</option>
<option>c</option>
</select>
我无法更改主结构,但'data'部分已经是我创建的两个XML文件的组合,所以可更改的是名称'FilterValue'或'Value'。
到目前为止,我尝试了以下(使用xsl 1.0):
<xsl:template match="features">
<xsl:for-each select="row">
<label>
<xsl:attribute name="for">Value<xsl:value-of select="position()" /></xsl:attribute>
<xsl:value-of select="@title">
</label>
<xsl:call-template name="featureOptions">
<xsl:with-param name="featureNr" select="position()" />
</xsl:call-template>
</xsl:for-each>
</xsl:template>
<xsl:template name="featureOptions">
<xsl:param name="featureNr" />
<xsl:variable name="FilterValue">
<xsl:value-of select="concat('FilterValue', $featureNr)" />
</xsl:variable>
<select>
<xsl:attribute name="id">Value<xsl:value-of select="$featureNr" /></xsl:attribute>
<xsl:for-each select="//data/row">
<xsl:if test="@*[contains(name(), $FilterValue)] != '' and not(preceding-sibling::z:row[@*[contains(name(), $FilterValue)] = current()/@*[contains(name(), $FilterValue)]])">
<option>
<xsl:attribute name="value"><xsl:value-of select="@*[contains(name(), $FilterWert)]" /></xsl:attribute>
<xsl:value-of select="@*[contains(name(), $FilterValue)]" />
</option>
</xsl:if>
</xsl:for-each>
</select>
</xsl:template>
因此,此解决方案仅适用于少于10个FilterValues。这就是为什么我尝试将条件contains(name(), $FilterValue)
更改为$FilterValue = substring(name(), string-length(name())-string-length($FilterValue) + 1)
,但这不起作用(我的浏览器中没有看到任何内容)。当我测试我的新条件时,我曾删除{i}用于检查不同值的preceding::sibling ..
条件,然后显示了下拉框(但当然没有明显的选项......)。我继续阅读有关键和分组的内容,但由于我将拥有大约300个FilterValue-Attributes,我不明白如何使用密钥而不使用300个,而provideFilter-Option是不固定的?所以接下来我读到的是generate-id() - Function。和以前一样的问题:如何将它与条件$FilterWert = substring(name(), string-length(name())-string-length($FilterWert) + 1)
(正在寻找“正确的”属性)结合起来?我的想法就像是
<xsl:key name="rows" match="z:row" use="."></xsl:key>
.....
<xsl:for-each select="//data/row[generate-id() = generate-id(key(rows, .)/@*[$FilterValue = substring(name(), string-length(name())-string-length($FilterValue) + 1)][1])]">
<option>
<xsl:attribute name="value"><xsl:value-of select="." /></xsl:attribute>
<xsl:value-of select="." />
</option>
</xsl:for-each>
或featureOptions-Template
中的其他for-each
<xsl:for-each select="//data/row[generate-id() = generate-id(preceding-sibling::row/@*[$FilterValue = substring(name(), string-length(name())-string-length($FilterValue) + 1)])]">
他们都没有显示正确的Dropdown Box。请有人解释一下为什么这两个想法都不起作用并给我一个新的想法或解决方案?
如果您需要更多信息,请与我们联系。
谢谢!