【问题标题】:Looping over distinct values循环不同的值
【发布时间】:2010-07-14 12:47:28
【问题描述】:

给定一个使用 distinct-values() 函数返回不同状态列表的变量,有没有办法在 for-each 循环中标记变量?

<States>
<State>AL</State>
<State>AL</State>
<State>NM</State>
</States>

以下变量返回 AL 和 NM,但我无法使用 for-each 对其进行迭代。有没有办法解决这个问题?

<xsl:variable name="FormStates" select="distinct-values(States/State)"/>
  <xsl:for-each select="$FormStates">

XSLT 2.0 正常。

【问题讨论】:

  • 与往常一样,根本不清楚您有什么问题。学习提供: 1. 源XML文档。 2.想要的结果。 3. 转换所需的属性。
  • 我已经投票决定关闭这个问题。这不是一个真正的问题——没有人问任何问题。问题没有定义,也不清楚。
  • 对不起,我希望能澄清这个问题。

标签: xslt xslt-2.0


【解决方案1】:

distinct-values() 函数返回一系列值,您应该能够对其进行迭代。结果可以说是“标记化”。

fn:distinct-values('AL', 'AL', 'NL') 返回序列('AL', 'NL')

如果您使用xsl:value-of 输出变量,它将返回字符串“AL NL”,仅因为xsl:value-of 的默认序列分隔符是单个空格字符。这是您可以使用 @separator 属性更改的内容:

输入

<?xml version="1.0" encoding="UTF-8"?>
<States>
  <State>AL</State>
  <State>AL</State>
  <State>NM</State>
</States>

XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:template match="/">
    <xsl:variable name="FormStates" select="distinct-values(States/State)"/>
    <xsl:comment>xsl:value-of</xsl:comment>
    <xsl:value-of select="$FormStates" separator=":"/>
    <xsl:comment>xsl:for-each</xsl:comment>
    <xsl:for-each select="$FormStates">
      <xsl:value-of select="."/>
      <xsl:text>:</xsl:text>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

输出

<?xml version="1.0" encoding="UTF-8"?>
<!--xsl:value-of-->
AL:NM
<!--xsl:for-each-->
AL:NM:

【讨论】:

  • 谢谢。我不知道分隔符属性。我最终构建了一个分隔字符串并使用了 tokenize(),但我会回去清理它。
【解决方案2】:

这是我过去使用过的 XSLT 1.0 解决方案。

  <xsl:template match="/">           
    <ul> 
      <xsl:for-each select="//State[not(.=preceding::*)]">
        <li>
          <xsl:value-of select="."/>
        </li>   
      </xsl:for-each>            
    </ul>
  </xsl:template>

返回:

<ul xmlns="http://www.w3.org/1999/xhtml">
  <li>AL</li>
  <li>NM</li>
</ul>

【讨论】:

    【解决方案3】:

    理论上它应该可以工作;你确定给distinct-values 函数的XPath 是正确的吗?您给出的代码要求 States 元素是 forms 元素的兄弟。

    您可以在变量声明后立即插入&lt;xsl:value-of select="count($FormStates)"&gt;,以确认它是否设置正确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 2020-03-20
      • 2018-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多