XSLT:为什么我的变量不能通过position()正确地递增?

时间:2019-07-31 06:26:31

标签: xml xslt position xslt-2.0

我有一个传入的SOAP xml请求,需要将其转换为XSLT,如下所示:

componentDidUpdate(prevProps){
    if(this.props.reducer.someFlag){
        this.props.history.push('/login')
    }
}

我的转换XSLT看起来像这样:

<q0:Operation namespace="Provisioning" name="Create" modifier="Data">
 <q0:ParameterList>
  <q0:StringParameter name="Action">Create</q0:StringParameter>
  <q0:StructParameter name="Create">
   <q0:StringParameter name="UserID">1234567X</q0:StringParameter>
   <q0:StringParameter name="Device1">abcd567890</q0:StringParameter>
   <q0:StringParameter name="Contract1">Postpaid</q0:StringParameter>
   <q0:StringParameter name="Line1">990108024011900</q0:StringParameter>
   <q0:StringParameter name="Device2">efgh567890</q0:StringParameter>
   <q0:StringParameter name="Contract2">Postpaid</q0:StringParameter>
   <q0:StringParameter name="Line2">990104562499105</q0:StringParameter>
  </q0:StructParameter>
 </q0:ParameterList>
</q0:Operation>

但是,由于某种原因,我的结果SOAP xml中的数字未正确递增,就好像它们是基于单个“计数器”变量而不是多个“计数器”变量一样:

<xsl:for-each select="//q0:CommandRequestData/q0:Command/q0:Transaction/q0:Operation/q0:ParameterList/q0:StructParameter[@name='Create']">
 <xsl:for-each select="q0:StringParameter[@name='UserID']">
  <ins:Parameter name="USER_ID" value="{string()}" />
 </xsl:for-each>
 <xsl:for-each select="q0:StringParameter[@name!='UserID']">
  <xsl:choose>
   <xsl:when test = "starts-with(@name, 'Device')">
    <xsl:variable name="DeviceIndex" select="position()"/>
    <ins:Parameter name="DEVICE_ID_{$DeviceIndex}" value="{string()}" />
   </xsl:when>
   <xsl:when test = "starts-with(@name, 'Contract')">
    <xsl:variable name="ContractIndex" select="position()"/>
    <ins:Parameter name="CONTRACT_TYPE_{$ContractIndex}" value="{string()}" />
   </xsl:when>
   <xsl:when test = "starts-with(@name, 'Line')">
    <xsl:variable name="LineIndex" select="position()"/>
    <ins:Parameter name="LINE_ID_{$LineIndex}" value="{string()}" />
   </xsl:when>
   <xsl:otherwise>
    <ins:Parameter name="NA" value="NA" />
   </xsl:otherwise>
  </xsl:choose>
 </xsl:for-each>
</xsl:for-each>

该如何解决?最好不要使用模板,因为我对模板还不够熟悉。

转换后的传出SOAP xml结果应已使用正确的编号重命名为StringParameters,如下所示:

<q0:Operation namespace="Provisioning" name="Create" modifier="Data">
 <q0:ParameterList>
  <q0:StringParameter name="Action">Create</q0:StringParameter>
  <q0:StructParameter name="Create">
   <q0:StringParameter name="USER_ID">1234567X</q0:StringParameter>
   <q0:StringParameter name="DEVICE_ID_1">abcd567890</q0:StringParameter>
   <q0:StringParameter name="CONTRACT_TYPE_2">Postpaid</q0:StringParameter>
   <q0:StringParameter name="LINE_ID_3">990108024011900</q0:StringParameter>
   <q0:StringParameter name="DEVICE_ID_4">efgh567890</q0:StringParameter>
   <q0:StringParameter name="CONTRACT_TYPE_5">Postpaid</q0:StringParameter>
   <q0:StringParameter name="LINE_ID_6">990104562499105</q0:StringParameter>
  </q0:StructParameter>
 </q0:ParameterList>
</q0:Operation>

1 个答案:

答案 0 :(得分:0)

position()的值由当前节点在当前节点集中的位置确定(或者,在XPath 2.0术语中,上下文项在以下序列中的位置)当前正在处理的项目)。当前节点集由您的指令建立:

<xsl:for-each select="q0:StringParameter[@name!='UserID']">

,其中包括所有{strong>所有 q0:StringParameter不是name的{​​{1}}元素。

如果您希望每种"UserID"都有特定的计数,请尝试更改:

name

收件人:

<xsl:variable name="DeviceIndex" select="position()"/>

,对于其他类型,依此类推。

或者,由于输入似乎已经具有正确的编号,您可以通过以下方式提取它:

<xsl:variable name="DeviceIndex">
    <xsl:number count="q0:StringParameter[starts-with(@name, 'Device')]"/>
</xsl:variable>