在xslt中逐个获取节点值

在xslt中逐个获取节点值,xslt,Xslt,我正在使用XSl文件,从xml节点读取值并创建另一个xml文件。下面是输入xml的一部分,我想从中逐个读取值节点 输入Xml: <Param> <RoomsInvs> <RoomInv> <ProvisionalId Id="13-0000000007">13-0000000007</ProvisionalId> </RoomInv> <RoomInv> <ProvisionalId I

我正在使用XSl文件,从xml节点读取值并创建另一个xml文件。下面是输入xml的一部分,我想从中逐个读取值节点

输入Xml:

<Param>
  <RoomsInvs>
<RoomInv>
    <ProvisionalId Id="13-0000000007">13-0000000007</ProvisionalId>
</RoomInv>
<RoomInv>
    <ProvisionalId Id="13-0000000008">13-0000000008</ProvisionalId>
</RoomInv>
  </RoomsInvs>
  <Rooms>
<Room NumberOfRooms="1" RoomId="TLC13-000005" Description="AC DEULEX" Twin="no" SupplierCode="RM" SupplierId="0" PropertyId="" ExtraBed="0" RateBasis="-4" Type="" Index="0">
    <Rate Id="0" Currency="INR" Gross="4990.00" DisplayCurrency="INR" DisplayGross="4990.00" Net="4990.00" Tax="0" STax="" ExtraGuestCharge="0" AdultCount="2" AdultRate="1490.00" ChildCount="0" ChildRate=".00" Description="" Status="Available" AllocationDetails="-" SDisc="" SComm="" SRoomTotal="">
        ieiorkmbjfgngjofmgfoikmfhkjg
    </Rate>
</Room>
<Room NumberOfRooms="2" RoomId="TLC13-000005" Description="AC DEULEX" Twin="no" SupplierCode="RM" SupplierId="0" PropertyId="" ExtraBed="0" RateBasis="-4" Type="" Index="0">
    <Rate Id="0" Currency="INR" Gross="4990.00" DisplayCurrency="INR" DisplayGross="4990.00" Net="4990.00" Tax="0" STax="" ExtraGuestCharge="0" AdultCount="2" AdultRate="1490.00" ChildCount="0" ChildRate=".00" Description="" Status="Available" AllocationDetails="-" SDisc="" SComm="" SRoomTotal="">
        dbfbjsdbfjsdfbkjsdfbklnlnlsdf
    </Rate>
</Room>
  </Rooms>
<Param>

13-0000000007
13-0000000008
ieiorkmbjfgngjofmgfoikmfhkjg
DBFBJSDBFJSDFBKJSDFBKLNLSDF
应用的Xsl:

<Rooms>
 <xsl:apply-templates select="//Rooms/Room" >
<xsl:with-param name ="IdNo" select ="//RoomsInvs/RoomInv"></xsl:with-param>
 </xsl:apply-templates>
</Rooms>

<xsl:template match="Room" >
<xsl:param name="IdNo"/>
<Room>
    <tempID>
    <xsl:value-of select="$IdNo[position()]/ProvisionalId"/>
    </tempID>
    <xsl:copy-of select="Rate"/>
</Room>

输出获取:

  <Rooms>
<Room>
    <tempID>13-0000000007</tempID>
    <Rate Id="0" Currency="INR" Gross="4990.00" DisplayCurrency="INR" DisplayGross="4990.00" Net="4990.00" Tax="0" STax="" ExtraGuestCharge="0" AdultCount="2" AdultRate="1490.00" ChildCount="0" ChildRate=".00" Description="" Status="Available" AllocationDetails="-" SDisc="" SComm="" SRoomTotal="">
        ieiorkmbjfgngjofmgfoikmfhkjg
    </Rate>
</Room>
<Room>
    <tempID>13-0000000007</tempID>
    <Rate Id="0" Currency="INR" Gross="4990.00" DisplayCurrency="INR" DisplayGross="4990.00" Net="4990.00" Tax="0" STax="" ExtraGuestCharge="0" AdultCount="2" AdultRate="1490.00" ChildCount="0" ChildRate=".00" Description="" Status="Available" AllocationDetails="-" SDisc="" SComm="" SRoomTotal="">
        dbfbjsdbfjsdfbkjsdfbklnlnlsdf
    </Rate>
</Room>
</Rooms> 

13-0000000007
ieiorkmbjfgngjofmgfoikmfhkjg
13-0000000007
DBFBJSDBFJSDFBKJSDFBKLNLSDF
我想要的输出:

  <Rooms>
<Room>
    <tempID>13-0000000007</tempID>
    <Rate Id="0" Currency="INR" Gross="4990.00" DisplayCurrency="INR" DisplayGross="4990.00" Net="4990.00" Tax="0" STax="" ExtraGuestCharge="0" AdultCount="2" AdultRate="1490.00" ChildCount="0" ChildRate=".00" Description="" Status="Available" AllocationDetails="-" SDisc="" SComm="" SRoomTotal="">
        ieiorkmbjfgngjofmgfoikmfhkjg
    </Rate>
</Room>
<Room>
    <tempID>13-0000000008</tempID>
    <Rate Id="0" Currency="INR" Gross="4990.00" DisplayCurrency="INR" DisplayGross="4990.00" Net="4990.00" Tax="0" STax="" ExtraGuestCharge="0" AdultCount="2" AdultRate="1490.00" ChildCount="0" ChildRate=".00" Description="" Status="Available" AllocationDetails="-" SDisc="" SComm="" SRoomTotal="">
        dbfbjsdbfjsdfbkjsdfbklnlnlsdf
    </Rate>
</Room>
</Rooms> 

13-0000000007
ieiorkmbjfgngjofmgfoikmfhkjg
13-0000000008
DBFBJSDBFJSDFBKJSDFBKLNLSDF

问题在于,您在谓词内部(在
[]
符号之间)使用了
position()
,其含义不同。应该将
position()
分配给变量,然后使用该变量。我相信这会产生预期的结果:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

  <xsl:template match="/">
    <Rooms>
      <xsl:apply-templates select="//Rooms/Room">
        <xsl:with-param name="IdNo" select="//RoomsInvs/RoomInv" />
      </xsl:apply-templates>
    </Rooms>
  </xsl:template>

  <xsl:template match="Room">
    <xsl:param name="IdNo" select="/.." />

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

    <Room>
      <tempID>
        <xsl:value-of select="$IdNo[$pos]/ProvisionalId" />
      </tempID>
      <xsl:copy-of select="Rate" />
    </Room>
  </xsl:template>
</xsl:stylesheet>


您给出的解决方案是正确的,但我错了。我没有被恰当地提到,我现在通过XSL所做的事情我已经编辑好了。好的,但是从你的例子来看,我不确定你想要完成什么。你能解释一下吗?或者我的示例解决了您的问题吗?在这个问题中,我调用了一个模板来完成其他一些工作。这个模板为我提供了两个节点,在这两个节点中,我希望获得两个“临时ID”值其中一个值用于模板的第一个节点,另一个值用于模板的第二个节点,但我得到了模板中两个节点的第一个值。所以我的问题是,如何避免重复,或者如何为从模板返回的每个节点获取单独的值?好的,我想我理解,但是您能提供一个与更新的XSLT对应的示例XML输入吗?您提供的代码仍然不包含任何
SomeOtherValue
元素。