XSLT 2.0跳过除一个之外的所有元素

时间:2016-11-17 12:21:44

标签: xml xslt

我的请求包含一些结构如下所示的元素:

<Request>
      <Other>
      ...
      </Other>
      <Qualifiers>
         <Options>
            <Segment Number="1"/>
         </Options> 
         <Offer>
            <Column ColumnNumber="2.1"/>
            <Record Number="2"/>
         </Offer>
         <Offer>
            <Column ColumnNumber="1.1"/>
            <Column EndColumnNumber="4.1" ColumnNumber="3.1"/>
            <Record Number="1"/>
         </Offer>
         <Offer>
            <Column ColumnNumber="5.1"/>
            <Record Number="3"/>
         </Offer>
         <Fare>
            <Basis>ABCDE</Basis>
         </Fare>
      </Qualifiers>
      <Other>
      ...
      </Other>
</Request>

从这个有效载荷中,我需要在每次调用中使用单个Offer元素执行3个单独的请求。其余的请求应该在没有更改的情况下被复制,因此对于first Offer,我的请求应该是这样的:

<Request>
      <Other>
      ...
      </Other>
      <Qualifiers>
         <Options>
            <Segment Number="1"/>
         </Options>
         <Offer>
            <Column ColumnNumber="2.1"/>
            <Record Number="2"/>
         </Offer>
         <Fare>
            <Basis>ABCDE</Basis>
         </Fare>
      </Qualifiers>
      <Other>
      ...
      </Other>
</Request>

第二个和第三个类似于第二个和第三个Offer元素。

我使用Camel,所以我尝试在循环中提供XSLT参数,该参数是应该留下的元素的索引。所以,我试过了:

<xsl:template match="node()|@*">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()" />
            </xsl:copy>
</xsl:template>

<xsl:template match="/Request/Qualifiers/Offer[not($MY_IDX)]"/>

$MY_IDX提供索引。经过一些搜索,我意识到它不起作用,因为not()函数接受并只返回布尔值。 有没有其他方法来存档我的目标?

1 个答案:

答案 0 :(得分:1)

而不是

<xsl:template match="/Request/Qualifiers/Offer[not($MY_IDX)]"/>

使用

<xsl:template match="/Request/Qualifiers/Offer[position() != $MY_IDX]" />

除了Offer之外的所有位置都由$MY_IDX取消。