我有一个传入的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>
答案 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>