通过XSL键遍历/循环:如何?

Kri*_*rgh 2 xslt foreach loops key

有没有办法遍历一个键并输出它包含的所有值?

   <xsl:key name="kElement" match="Element/Element[@idref]" use="@idref" />
Run Code Online (Sandbox Code Playgroud)

我虽然这样:

<xsl:for-each select="key('kElement', '.')">
  <li><xsl:value-of select="." /></li>
</xsl:for-each>
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用.我只是想列出一个键中的所有值以进行测试.

问题很简单:如何做到这一点?

Wel*_*bog 13

你不能.这不是关键所在.

key()只有当每个元素的键相同时,才可以使用单个调用遍历键中的每个元素.

如果需要循环定义键的所有内容,则可以使用元素match="..."属性中的表达式<key>.

所以如果你有这样的文件:

<root>
  <element name="Bill"/>
  <element name="Francis"/>
  <element name="Louis"/>
  <element name="Zoey"/>
</root>
Run Code Online (Sandbox Code Playgroud)

并且键定义如下:

<xsl:key name="survivors" match="element" use="@name"/>
Run Code Online (Sandbox Code Playgroud)

您可以使用其match属性的内容遍历密钥使用的内容:

<xsl:for-each select="element">
  <!-- stuff -->
</xsl:for-each>
Run Code Online (Sandbox Code Playgroud)

或者,如果每个元素都有一些共同点:

<root>
  <element name="Bill" class="survivor"/>
  <element name="Francis" class="survivor"/>
  <element name="Louis" class="survivor"/>
  <element name="Zoey" class="survivor"/>
</root>
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样定义你的密钥:

<xsl:key name="survivors" match="element" use="@class"/>
Run Code Online (Sandbox Code Playgroud)

并遍历所有这样的元素:

<xsl:for-each select="key('survivors', 'survivor')">
  <!-- stuff -->
</xsl:for-each>
Run Code Online (Sandbox Code Playgroud)

因为每个元素共享class属性的值"幸存者" .

在你的情况下,你的钥匙是

<xsl:key name="kElement" match="Element/Element[@idref]" use="@idref" />
Run Code Online (Sandbox Code Playgroud)

所以你可以遍历它有这样的一切:

<xsl:for-each select="Element/Element[@idref]">
  <!-- stuff -->
</xsl:for-each>
Run Code Online (Sandbox Code Playgroud)

  • 享受L4D参考,这个答案对我也有帮助! (4认同)

MrW*_*son 5

CAN创建密钥用于循环-如果你只需指定一个固定的关键元素的使用属性:

<xsl:key name="survivors" match="element" use="'all'"/>
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过以下方式遍历所有元素:

<xsl:for-each select="key('survivors','all')">
    ...
</xsl:for-each>
Run Code Online (Sandbox Code Playgroud)

或算一算:

<xsl:value-of select="count(key('survivors','all'))"/>
Run Code Online (Sandbox Code Playgroud)

请注意,常量可以是任何字符串,甚至是数字 - 但"全部"读取得很好.

但是,您无法使用此密钥查找有关各个条目的信息(因为它们都具有相同的密钥).

换句话说,有两种类型的可能键:

  1. "lookup keys"= use属性中具有不同索引的标准键
  2. "循环键"=使用属性中具有常量的键

我不知道这个方法的执行效率如何,但它确实通过避免在整个XSL代码中重复相同(可能非常复杂)的XPath表达式来提高XSL的维护效率.