如何使用XSLT将元素作为第n条记录插入

如何使用XSLT将元素作为第n条记录插入,xslt,soa,Xslt,Soa,考虑以下输入: <SettleList> <SettleObject> <ExternalVar>5</ExternalVar> </SettleObject> <SettleObject> <ExternalVar>10</ExternalVar> </SettleObject> </SettleList> 5. 10 现在的要求是:除第5和第10条之外的所

考虑以下输入:

<SettleList>
<SettleObject>
  <ExternalVar>5</ExternalVar>
 </SettleObject>
 <SettleObject>
  <ExternalVar>10</ExternalVar>
</SettleObject>
</SettleList>

5.
10
现在的要求是:除第5和第10条之外的所有记录都必须为零,而第5和第10条将包含值。 prob使用的是apply模板,对于第二个对象,无法发送任何参数,因此索引再次从1开始,而不是从第6条记录开始


我正在使用XSLT尝试这一点,您的XML一开始似乎格式不正确。我不明白为什么一个简单的递归模板不能做到这一点

在我的示例中,我使用了输入数据:

<SettleList>
    <SettleObject>
        <ExternalVar>3</ExternalVar>
    </SettleObject>
    <SettleObject>
        <ExternalVar>5</ExternalVar>
    </SettleObject>
    <SettleObject>
        <ExternalVar>10</ExternalVar>
    </SettleObject>
    <SettleObject>
        <ExternalVar>14</ExternalVar>
    </SettleObject>
</SettleList>

3.
5.
10
14
运行此脚本时:

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

<xsl:template match="SettleObject[ExternalVar=5]">
    <xsl:copy-of select="."/>
</xsl:template>

<xsl:template match="SettleObject[ExternalVar=10]">
    <xsl:copy-of select="."/>
</xsl:template>

<xsl:template match="SettleObject">
    <SettleObject>
        <ExternalVar>0</ExternalVar>
    </SettleObject>
</xsl:template>

0
我得到这个输出:

<SettleList>
    <SettleObject>
        <ExternalVar>0</ExternalVar>
    </SettleObject>
    <SettleObject>
        <ExternalVar>5</ExternalVar>
    </SettleObject>
    <SettleObject>
        <ExternalVar>10</ExternalVar>
    </SettleObject>
    <SettleObject>
        <ExternalVar>0</ExternalVar>
    </SettleObject>
</SettleList>

0
5.
10
0

这是您想要的输出吗?

您的XML一开始似乎格式不正确。我不明白为什么一个简单的递归模板不能做到这一点

在我的示例中,我使用了输入数据:

<SettleList>
    <SettleObject>
        <ExternalVar>3</ExternalVar>
    </SettleObject>
    <SettleObject>
        <ExternalVar>5</ExternalVar>
    </SettleObject>
    <SettleObject>
        <ExternalVar>10</ExternalVar>
    </SettleObject>
    <SettleObject>
        <ExternalVar>14</ExternalVar>
    </SettleObject>
</SettleList>

3.
5.
10
14
运行此脚本时:

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

<xsl:template match="SettleObject[ExternalVar=5]">
    <xsl:copy-of select="."/>
</xsl:template>

<xsl:template match="SettleObject[ExternalVar=10]">
    <xsl:copy-of select="."/>
</xsl:template>

<xsl:template match="SettleObject">
    <SettleObject>
        <ExternalVar>0</ExternalVar>
    </SettleObject>
</xsl:template>

0
我得到这个输出:

<SettleList>
    <SettleObject>
        <ExternalVar>0</ExternalVar>
    </SettleObject>
    <SettleObject>
        <ExternalVar>5</ExternalVar>
    </SettleObject>
    <SettleObject>
        <ExternalVar>10</ExternalVar>
    </SettleObject>
    <SettleObject>
        <ExternalVar>0</ExternalVar>
    </SettleObject>
</SettleList>

0
5.
10
0

这是您想要的输出吗?

您没有指定XSLT版本,所以我使用了版本2.0

该解决方案基于(例如)5个连续的沉降对象标记的分组 然后插入一个额外的标签

在这里,在当前组之后,我输出一个ExtraObject标记(示例 在上一组之后应添加的内容)


额外对象#
在XSLT1.0中,可以使用Muenchian groupng实现另一种解决方案。
请参见您自己的示例(即使在stackoverflow上)。

您没有指定XSLT版本,因此我使用了2.0版

该解决方案基于(例如)5个连续的沉降对象标记的分组 然后插入一个额外的标签

在这里,在当前组之后,我输出一个ExtraObject标记(示例 在上一组之后应添加的内容)


额外对象#
在XSLT1.0中,可以使用Muenchian groupng实现另一种解决方案。 请参见您自己的示例(即使在stackoverflow上)。

保持简单

输入:

<SettleList xmlns="http://xmlns.oracle.com/TestApp/TestAppComposite/BPELProcess1">
   <SettleObject>
      <ExternalVar>1</ExternalVar>
   </SettleObject>
   <SettleObject>
      <ExternalVar>2</ExternalVar>
   </SettleObject>
   <SettleObject>
      <ExternalVar>3</ExternalVar>
   </SettleObject>
   <SettleObject>
      <ExternalVar>4</ExternalVar>
   </SettleObject>
   <SettleObject>
      <ExternalVar>5</ExternalVar>
   </SettleObject>
   <SettleObject>
      <ExternalVar>6</ExternalVar>
   </SettleObject>
   <SettleObject>
      <ExternalVar>7</ExternalVar>
   </SettleObject>
   <SettleObject>
      <ExternalVar>8</ExternalVar>
   </SettleObject>
   <SettleObject>
      <ExternalVar>9</ExternalVar>
   </SettleObject>
   <SettleObject>
      <ExternalVar>10</ExternalVar>
   </SettleObject>
</SettleList>

1.
2.
3.
4.
5.
6.
7.
8.
9
10
XSL:


0
输出:

<?xml version = '1.0' encoding = 'UTF-8'?>
<ns0:SettleList xmlns:plnk="http://docs.oasis-open.org/wsbpel/2.0/plnktype" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns0="http://xmlns.oracle.com/TestApp/TestAppComposite/BPELProcess1">
   <ns0:SettleObject>
      <ns0:ExternalVar>0</ns0:ExternalVar>
   </ns0:SettleObject>
   <ns0:SettleObject>
      <ns0:ExternalVar>0</ns0:ExternalVar>
   </ns0:SettleObject>
   <ns0:SettleObject>
      <ns0:ExternalVar>0</ns0:ExternalVar>
   </ns0:SettleObject>
   <ns0:SettleObject>
      <ns0:ExternalVar>0</ns0:ExternalVar>
   </ns0:SettleObject>
   <ns0:SettleObject>
      <ns0:ExternalVar>5</ns0:ExternalVar>
   </ns0:SettleObject>
   <ns0:SettleObject>
      <ns0:ExternalVar>0</ns0:ExternalVar>
   </ns0:SettleObject>
   <ns0:SettleObject>
      <ns0:ExternalVar>0</ns0:ExternalVar>
   </ns0:SettleObject>
   <ns0:SettleObject>
      <ns0:ExternalVar>0</ns0:ExternalVar>
   </ns0:SettleObject>
   <ns0:SettleObject>
      <ns0:ExternalVar>0</ns0:ExternalVar>
   </ns0:SettleObject>
   <ns0:SettleObject>
      <ns0:ExternalVar>10</ns0:ExternalVar>
   </ns0:SettleObject>
</ns0:SettleList>

0
0
0
0
5.
0
0
0
0
10
保持简单

输入:

<SettleList xmlns="http://xmlns.oracle.com/TestApp/TestAppComposite/BPELProcess1">
   <SettleObject>
      <ExternalVar>1</ExternalVar>
   </SettleObject>
   <SettleObject>
      <ExternalVar>2</ExternalVar>
   </SettleObject>
   <SettleObject>
      <ExternalVar>3</ExternalVar>
   </SettleObject>
   <SettleObject>
      <ExternalVar>4</ExternalVar>
   </SettleObject>
   <SettleObject>
      <ExternalVar>5</ExternalVar>
   </SettleObject>
   <SettleObject>
      <ExternalVar>6</ExternalVar>
   </SettleObject>
   <SettleObject>
      <ExternalVar>7</ExternalVar>
   </SettleObject>
   <SettleObject>
      <ExternalVar>8</ExternalVar>
   </SettleObject>
   <SettleObject>
      <ExternalVar>9</ExternalVar>
   </SettleObject>
   <SettleObject>
      <ExternalVar>10</ExternalVar>
   </SettleObject>
</SettleList>

1.
2.
3.
4.
5.
6.
7.
8.
9
10
XSL:


0
输出:

<?xml version = '1.0' encoding = 'UTF-8'?>
<ns0:SettleList xmlns:plnk="http://docs.oasis-open.org/wsbpel/2.0/plnktype" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns0="http://xmlns.oracle.com/TestApp/TestAppComposite/BPELProcess1">
   <ns0:SettleObject>
      <ns0:ExternalVar>0</ns0:ExternalVar>
   </ns0:SettleObject>
   <ns0:SettleObject>
      <ns0:ExternalVar>0</ns0:ExternalVar>
   </ns0:SettleObject>
   <ns0:SettleObject>
      <ns0:ExternalVar>0</ns0:ExternalVar>
   </ns0:SettleObject>
   <ns0:SettleObject>
      <ns0:ExternalVar>0</ns0:ExternalVar>
   </ns0:SettleObject>
   <ns0:SettleObject>
      <ns0:ExternalVar>5</ns0:ExternalVar>
   </ns0:SettleObject>
   <ns0:SettleObject>
      <ns0:ExternalVar>0</ns0:ExternalVar>
   </ns0:SettleObject>
   <ns0:SettleObject>
      <ns0:ExternalVar>0</ns0:ExternalVar>
   </ns0:SettleObject>
   <ns0:SettleObject>
      <ns0:ExternalVar>0</ns0:ExternalVar>
   </ns0:SettleObject>
   <ns0:SettleObject>
      <ns0:ExternalVar>0</ns0:ExternalVar>
   </ns0:SettleObject>
   <ns0:SettleObject>
      <ns0:ExternalVar>10</ns0:ExternalVar>
   </ns0:SettleObject>
</ns0:SettleList>

0
0
0
0
5.
0
0
0
0
10

这太快了。非常感谢你。所需的输出最多为第五条记录,即所有外部变量都为“0”,然后从第六条到第十条以及“0”。我输入了多达100条记录,需要在所有不可用的标记之间插入“0”。如果我没有误解您,此脚本将生成该输出。如果我错了,请在你的问题中添加所需的输出。谢谢你的帮助。你能告诉我“@*|node()”是做什么的吗。很抱歉,我对xslt编码还不太熟悉。那太快了。非常感谢你。所需的输出最多为第五条记录,即所有外部变量都为“0”,然后从第六条到第十条以及“0”。我输入了多达100条记录,需要在所有不可用的标记之间插入“0”。如果我没有误解您,此脚本将生成该输出。如果我错了,请在你的问题中添加所需的输出。谢谢你的帮助。你能告诉我“@*|node()”是做什么的吗。很抱歉,我对xslt编码相当陌生。非常感谢Valdi_-Bo。我正在研究你的解决办法。我正在使用XSLT版本1.0。谢谢Valdi_-bo。老实说,你的代码让我觉得我对XSLT一无所知:(.我还没有使用过2.0,而且对于每个小组来说都是新的。我会尝试理解你的代码。非常感谢Valdi_-Bo。我正在研究你的解决方案。我正在使用XSLT版本1.0。感谢Valdi_-Bo。老实说,你的代码让我觉得我对XSLT一无所知:(.我没有使用过2.0,对于每个组,我都是新手。我会尝试理解您的代码。您的问题不清楚。您有两个记录,有两个值(或者更确切地说,如果您的XML格式正确,您会有)。是否要在每个现有记录之前插入4个空记录?还是要将现有记录的值归零?请澄清并发布更广泛的示例,包括预期的输出。是的,Michael。我已使用格式良好的xml更新了代码。对于所需的ExternalVar的每个值,需要创建特定记录钕铼