1

我是 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>

我无法更改主要结构,但“数据”部分已经是我创建的两个 XML 文件的组合,所以可以更改的是名称“过滤器值”或“值”。

到目前为止,我尝试了以下方法(使用 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),但这不起作用(在我的浏览器中没有看到任何内容)。当我测试我的新条件时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>

for-eachfeatureOptions-Template 中的另一个

<xsl:for-each select="//data/row[generate-id() = generate-id(preceding-sibling::row/@*[$FilterValue = substring(name(), string-length(name())-string-length($FilterValue) + 1)])]">

他们都没有显示正确的下拉框。请有人能解释一下为什么这两个想法都行不通并给我一个新的想法或解决方案吗?

如果您需要更多信息,请告诉我。

谢谢!

4

0 回答 0