4

使用XSLT 1.0.

<xsl:for-each select="*">
    <xsl:variable name="xxxx" select="@name" />
    <xsl:if test="../../../../fieldMap/field[@name=$xxxx]">...
        <xsl:if test="position() != last()">////this is not work correctly as last() number is actual last value of for loop and position() is based on if condition.
            <xsl:text>,</xsl:text>
        </xsl:if>
    </xsl:if>
</xsl:for-each>

你能建议我如何在这里删除最后一个' ,'吗?

4

3 回答 3

10

position()并且last()应该基于循环,而不是xsl:if. 我认为您要说的是您实际上是想检查这是否是最后一个元素为xsl:if真,因为这样的元素实际上可能不是循环中的最后一个元素。

我建议将您的xsl:for-eachandxsl:if合并为一个,并仅选择条件为真的那些元素。这样您就应该能够以您期望的方式检查位置

<xsl:for-each select="*[@name = ../../../../fieldMap/field/@name]">

    <xsl:if test="position() != last()">
         <xsl:text>,</xsl:text>
    </xsl:if>
</xsl:for-each>
于 2013-06-13T23:27:04.277 回答
1

你可以改变你的内在if

    <xsl:if test="not(following-sibling::*[
                   @name = ../../../../fieldMap/field/@name])">
        <xsl:text>,</xsl:text>
    </xsl:if>

顺便说一句,这是因为“一般比较”。IE

A = B

如果 A 选择的任何节点等于 B 选择的任何节点(具有相同的值),则为真。

为了DRY,我可能会放入../../../../fieldMap/field/@name一个变量并在for-each循环开始之前声明它:

<xsl:variable name="fieldNames" select="../../../../fieldMap/field/@name" />
<xsl:for-each select="*">
    <xsl:if test="$fieldNames = @name">...
        <xsl:if test="not(following-sibling::*[@name = $fieldNames])">
            <xsl:text>,</xsl:text>
        </xsl:if>
    </xsl:if>
</xsl:for-each>

同样,$fieldNames 可以是多个属性节点的节点集,当我们说 时$fieldNames = @name,我们是在询问 的值是否@name等于 中任何节点的值$fieldNames

于 2013-06-13T20:08:02.637 回答
0

翻译、替换、拆分连接在 XSLT 中不起作用。我实现了一种在我的 XSLT 中运行良好的简单方法

示例代码:

  <xsl:variable name="ErrorCPN">
    <xsl:if test="count(/DATA_DS/G_1)>0 and count(/DATA_DS/CPN)>0">
      <xsl:for-each select="$BIPReportCPN/ns3:BIPCPN/ns3:BIPEachCPNDelimitedValue">
        <xsl:variable name="BIPEachCPNDelimitedValue" select="."/>
        <xsl:if test="count(/DATA_DS/G_1[CPN=$BIPEachCPNDelimitedValue]/CPN)=0">
          <xsl:value-of select="concat($BIPEachCPNDelimitedValue,',')"/>
        </xsl:if>
      </xsl:for-each>
    </xsl:if>
  </xsl:variable>
  <xsl:value-of select="substring($ErrorCPN,1,string-length($ErrorCPN)-1)"/>
</xsl:if> 

我创建了一个变量,在 if 和每个实现的条件中,每个循环所需的值都用逗号连接,在循环结束时,我们不需要额外的一个逗号。因此,我们可以获取子字符串并消除最后一个逗号。

否则使用示例代码并尝试。

于 2020-09-23T04:56:11.767 回答