【问题标题】:Incrementing variable in xsltxslt中的递增变量
【发布时间】:2014-06-04 01:03:22
【问题描述】:

我有一个 for each 循环和一个 for 循环下的 if 条件。如果 if 条件为真,我想每次都增加变量 i 的值。基于变量 i 的值,我想实现一些逻辑。下面是代码

<xsl:variable name="i" select="0"/>
<xsl:for-each select="Request/ModifyProductsAndPackages/NrcList/Nrc">
<xsl:variable name="typeIdNrcVar" select="TypeIdNrc"/>

<xsl:if test="count(/Request/WaiveNrcList/WaiveNrc/TypeIdNrc[text()=$typeIdNrcVar])=0">
   <xsl:variable name="i" select="$i + 1"/>
   <xsl:if test ="$i=1">
    do something
   </xsl:if>
</xsl:if>
</xsl:for-each/>

这里 i 的值不能增加。谁能建议我应该如何完成上述任务。感谢您的帮助。

下面是xml结构

<Request>
<ModifyProductsAndPackages>
<NrcList>
   <Nrc>
     <TypeIdNrc>14046</TypeIdNrc>
     <ServiceInternalId>98602440</ServiceInternalId>
     <ServiceInternalIdResets>0</ServiceInternalIdResets>
     <ViewableOnly>1</ViewableOnly>
   </Nrc>
   <Nrc>
     <TypeIdNrc>12002</TypeIdNrc>
     <ServiceInternalId>98602440</ServiceInternalId>
     <ServiceInternalIdResets>0</ServiceInternalIdResets>
     <ViewableOnly>1</ViewableOnly>
   </Nrc>
   <Nrc>
     <TypeIdNrc>13006</TypeIdNrc>
     <ServiceInternalId>98602440</ServiceInternalId>
     <ServiceInternalIdResets>0</ServiceInternalIdResets>
     <ViewableOnly>1</ViewableOnly>
   </Nrc>
   <Nrc>
     <TypeIdNrc>14098</TypeIdNrc>
     <ServiceInternalId>98602440</ServiceInternalId>
     <ServiceInternalIdResets>0</ServiceInternalIdResets>
     <ViewableOnly>1</ViewableOnly>
   </Nrc>
 </NrcList>     
 </ModifyProductsAndPackages>
<WaiveNrcList>
<WaiveNrc>
  <TypeIdNrc>12002</TypeIdNrc>
  <ServiceInternalId>98602440</ServiceInternalId>
  <ServiceInternalIdResets>0</ServiceInternalIdResets>
</WaiveNrc>
<WaiveNrc>
  <TypeIdNrc>13256</TypeIdNrc>
  <ServiceInternalId>98602440</ServiceInternalId>
  <ServiceInternalIdResets>0</ServiceInternalIdResets>
</WaiveNrc>
<WaiveNrc>
  <TypeIdNrc>14046</TypeIdNrc>
  <ServiceInternalId>98602440</ServiceInternalId>
  <ServiceInternalIdResets>0</ServiceInternalIdResets>
</WaiveNrc>
</WaiveNrcList>
</Request>

我想要达到的最终结果是NrcList = NrcList-WaiveNrcList。我想根据 TypeIdNrc、ServiceInternalId、ServiceInternalIdResets 排除匹配记录 下面是结果xml

<Request>
  <NrcList>
    <Nrc>
      <TypeIdNrc>13006</TypeIdNrc>
      <ServiceInternalId>98602440</ServiceInternalId>
      <ServiceInternalIdResets>0</ServiceInternalIdResets>
<ViewableOnly>1</ViewableOnly>
</Nrc>
<Nrc>
<TypeIdNrc>14098</TypeIdNrc>
<ServiceInternalId>98602440</ServiceInternalId>
<ServiceInternalIdResets>0</ServiceInternalIdResets>
<ViewableOnly>1</ViewableOnly>
    </Nrc>
</NrcList>
</Request> 

另一种方法:

【问题讨论】:

  • 您需要为此使用递归模板。请更详细地准确描述您想要实现的目标。你想增加什么变量?您打算如何离开循环(当所有元素都完成时?当$i 是某个值时?$i 是什么意思?)
  • 我想增加变量 i,如果 i 的值为 1,那么我想实现一些逻辑,否则做一些其他的逻辑
  • 在 XSLT 中,不能修改变量。您为什么不编辑您的问题并更详细地解释您想要完成的什么 - 而不是您希望如何完成它。

标签: xslt xslt-1.0


【解决方案1】:

这是一个示例,它仅复制 WaiveNrcList 中具有匹配记录的 Nrc 元素 - 基于匹配的 TypeIdNrc

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="waive" match="WaiveNrc" use="TypeIdNrc" />

<xsl:template match="/">
    <Request>
        <NrcList>
            <xsl:for-each select="Request/ModifyProductsAndPackages/NrcList/Nrc[not(key('waive', TypeIdNrc))]">
                <xsl:copy-of select="."/>
            </xsl:for-each>
        </NrcList>
    </Request>
</xsl:template>

</xsl:stylesheet>

应用于您的输入示例,结果为:

<?xml version="1.0" encoding="UTF-8"?>
<Request>
   <NrcList>
      <Nrc>
         <TypeIdNrc>13006</TypeIdNrc>
         <ServiceInternalId>98602440</ServiceInternalId>
         <ServiceInternalIdResets>0</ServiceInternalIdResets>
         <ViewableOnly>1</ViewableOnly>
      </Nrc>
      <Nrc>
         <TypeIdNrc>14098</TypeIdNrc>
         <ServiceInternalId>98602440</ServiceInternalId>
         <ServiceInternalIdResets>0</ServiceInternalIdResets>
         <ViewableOnly>1</ViewableOnly>
      </Nrc>
   </NrcList>
</Request>

【讨论】:

  • 感谢迈克尔的回复。在这种情况下,键是 TypeIdNrc、ServiceInternalId 和 ServiceInternalIdResets。有没有办法匹配所有 3 个字段。
  • @user3366906 是的,在键定义(use 属性)和调用 key() 函数时使用所有三个的串联。
  • ` `
  • 对吗?
  • @user3366906 是的,除了为了防止误报,您应该在值之间放置一个分隔符,例如concat(TypeIdNrc, '|', ServiceInternalId, '|', ServiceInternalIdResets).
猜你喜欢
  • 1970-01-01
  • 2013-02-20
  • 2011-11-20
  • 2011-11-05
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多