每次 for-each 迭代获取 2 个结果值

Posted

技术标签:

【中文标题】每次 for-each 迭代获取 2 个结果值【英文标题】:Getting 2 result values every for-each iteration 【发布时间】:2021-10-02 07:27:21 【问题描述】:

我正在使用“xsl:for-each”来迭代每个元素的名称内容和包含文本“句点”的属性。当每次“xsl:for-each”迭代尝试取出一个日期时,它会返回 2 个值。

文本“句号”的匹配必须这样完成,因为输入数据可能会发生变化,并且不知道有多少id包含“句号”的元素会出现在数据中。

我想将 xpath 搜索条件保留在“xsl:for-each”语法中,因为我使用模板来指出 root。

当我尝试使用 date[1] 对日期进行子集化时,它仍然返回两个日期。

XSLT Fiddle

与上面小提琴中的代码相同:

数据:

<?xml version="1.0" encoding="utf-8" ?>
<section>
  <content id="period1">
      <date>2021-01-01</date>
  </content>
  <content id="period2">
      <date>2020-01-01</date>
  </content>
</section>

XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    exclude-result-prefixes="#all"
    >

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:output method="html" indent="yes" html-version="5"/>

  <xsl:template match="/section">
    
    <xsl:for-each select="//content/@*[contains(., 'period')]">
        <date>
            <!--<xsl:value-of select="."/>-->
            <!--<xsl:value-of select="//date[1]"/>-->
            <xsl:value-of select="//content/date"/>
        </date>
    </xsl:for-each>
    
  </xsl:template>
  
</xsl:stylesheet>

结果:

<!DOCTYPE HTML>
<date>2021-01-01 2020-01-01</date>
<date>2021-01-01 2020-01-01</date>

想要的结果:

<!DOCTYPE HTML>
<date>2021-01-01</date>
<date>2020-01-01</date>

【问题讨论】:

【参考方案1】:

使用相对路径

   <xsl:for-each select="content[@*[contains(., 'period')]]">
        <date>
            <!--<xsl:value-of select="."/>-->
            <!--<xsl:value-of select="//date[1]"/>-->
            <xsl:value-of select="date"/>
        </date>
    </xsl:for-each>

【讨论】:

以上是关于每次 for-each 迭代获取 2 个结果值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PySpark 进行嵌套的 for-each 循环

集合foreach迭代时,边迭代边删除,只能使用迭代器删除,不能使用集合删除,否则会导致并发修改异常for-each和Iterator的选择

2优先使用for-each循环

CoffeeScript 每次迭代都会向结果数组添加几个对象

python函数—迭代器

python函数—迭代器