Xslt 此应用模板无法正常工作的原因

Xslt 此应用模板无法正常工作的原因,xslt,xslt-1.0,Xslt,Xslt 1.0,如果假设我的数据库有三行记录,通过获取这些数据,我将转换为xml数据,如下所示: 以下是我的XML: <NewDataSet> <Table> <RECORD_TYPE_CODE>CTD</RECORD_TYPE_CODE> <MSG_TYPE_CODE>O103N</MSG_TYPE_CODE> <CTD_SEQ_NUM>000086</CTD_SEQ_NUM> <CTD_CTD_PK

如果假设我的数据库有三行记录,通过获取这些数据,我将转换为xml数据,如下所示:

以下是我的XML:

<NewDataSet>
 <Table>
<RECORD_TYPE_CODE>CTD</RECORD_TYPE_CODE>
<MSG_TYPE_CODE>O103N</MSG_TYPE_CODE>
<CTD_SEQ_NUM>000086</CTD_SEQ_NUM>   
<CTD_CTD_PKG_ID>2</CTD_CTD_PKG_ID>
</Table>
<Table>
<RECORD_TYPE_CODE>CTO</RECORD_TYPE_CODE>
<MSG_TYPE_CODE>O203N</MSG_TYPE_CODE>
<CTD_SEQ_NUM>000087</CTD_SEQ_NUM>   
<CTD_CTD_PKG_ID>2</CTD_CTD_PKG_ID>
</Table>
<Table>
<RECORD_TYPE_CODE>CTH</RECORD_TYPE_CODE>
<MSG_TYPE_CODE>O303N</MSG_TYPE_CODE>
<CTD_SEQ_NUM>000088</CTD_SEQ_NUM>   
<CTD_CTD_PKG_ID>2</CTD_CTD_PKG_ID>   
</Table>
</NewDataSet>

CTD
O103N
000086
2.
首席技术官
O203N
000087
2.
CTH
O303N
000088
2.
通过c sharp代码隐藏,使用for循环发送包id(CTD_CTD_PKG_id)和Sequencenum(CTD_SEQ_NUM)通过xslt参数,它是按顺序正确传递的,如00008600087000088,但在aloop中,我将第一次传递000086 seqnum,它是以正确的方式获取的,然后当我传递000087时,它正在生成000086表中的数据。只有发生的原因,传递参数值是按顺序正确传递的

这是我的XSLT:

    <xsl:param name="PackageId"  />
<xsl:param name="SequenceNum"  />
<xsl:template match="/">
<xsl:apply-templates mode="SequenceB"  select="(NewDataSet/Table[CTD_CTD_PKG_ID =$PackageId]    |   NewDataSet/Table[CTD_SEQ_NUM =$SequenceNum])[1]"/>
</xsl:template>

我猜(如果我的猜测不正确,您需要更好地解释问题),您的
$PackageId
参数的值始终定义为
2

您正在使用的XPath表达式:

    (NewDataSet/Table[CTD_CTD_PKG_ID =$PackageId]
   |
     NewDataSet/Table[CTD_SEQ_NUM =$SequenceNum]
     )
     [1]
从以下选定节点的并集中选择第一个节点:

NewDataSet/Table[CTD_CTD_PKG_ID =$PackageId]
以及:

请注意,如果
$PackageId
参数的值为
2
,则其并集的第一个节点始终为
/*/Table[1]

解决方案是用替换您正在使用的XPath表达式:

NewDataSet/Table[CTD_CTD_PKG_ID =$PackageId][CTD_SEQ_NUM =$SequenceNum]

谢谢,以前它总是从第一个表中获取数据,包id 00086现在它正在正确更改,我已经了解了如何通过在select CLEARY中基于多个条件来获取数据。@dimitre Novatchev:您能简要说明为什么以及何时必须使用position=1,因为我对此感到非常困惑please@pravz:
[1]
[position()=1]
的缩写。更一般地说,
[some integer type expression]
[position()=some integer type expression]
的缩写。必须使用较长形式的情况是,XSLT处理器不可能知道谓词中表达式的类型是整数(但可以保证这一点)。例如:
books[$bookNumber]
这里只有您知道
$bookNumber
必须是一个整数,但通常它可以有任何值,例如
'Hello world'
。在所有这些情况下,XSLT处理器都会计算expr的布尔值。
NewDataSet/Table[CTD_CTD_PKG_ID =$PackageId][CTD_SEQ_NUM =$SequenceNum]