使用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>
你能建议我如何在这里删除最后一个',
?
答案 0 :(得分:7)
position()
和last()
应基于循环,而不是xsl:if
。我想你要说的是你实际上想要检查这是否是xsl:if
为真的最后一个元素,因为这样的元素实际上可能不是循环中的最后一个元素。
我建议将您的xsl:for-each
和xsl:if
合并为一个,并仅选择条件为真的那些元素。那样你就可以按照预期的方式检查位置
<xsl:for-each select="*[@name = ../../../../fieldMap/field/@name]>
<xsl:if test="position() != last()">
<xsl:text>,</xsl:text>
</xsl:if>
</xsl:for-each>
答案 1 :(得分:1)
您可以将内部if
更改为:
<xsl:if test="not(following-sibling::*[
@name = ../../../../fieldMap/field/@name])">
<xsl:text>,</xsl:text>
</xsl:if>
由于“一般比较”,BTW这是有效的。即。
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
中任何节点的值
答案 2 :(得分: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>
我创建了一个变量,并在内部以及是否针对每个实现的条件创建了一个变量,对于每个循环,所需值都用逗号连接起来,在循环结束时,将出现一个多余的逗号,这对我们来说不是必需的。因此,我们可以使用子字符串并消除最后一个逗号。
否则,请使用示例代码并尝试。