我从XML文件中提取数据。我正在使用xsltproc,xml版本1.0的linux盒子上工作。该文件包含列车信息。我有一个带有货车和集装箱的发动机。火车可以有多个货车,而货车可以有多个货箱。我希望在下面的文件中引用MSGHEADER
和CONTENT
到每个WAGON
和每个容器。
给我
MSGHEADER Data MSGHEADER CONTENT Data CONTENT ; WAGON 1 Data WAGON 1 ;
CONTAINER 1:1 Data CONTAINER 1:1 ; MSGHEADER Data MSGHEADER CONTENT Data CONTENT ;
WAGON 1 Data WAGON 1 ; CONTAINER 1:2 Data CONTAINER 1:2 MSGHEADER Data MSGHEADER ;
CONTENT Data CONTENT ; WAGON 2 Data WAGON 2 ; CONTAINER 2:1 Data CONTAINER 2:1 ;
MSGHEADER Data MSGHEADER ; CONTENT Data CONTENT ; WAGON 2 Data WAGON 2 ;
CONTAINER 2:2 Data CONTAINER 2:2
等等货车和集装箱的数量可能会有所不同。我需要从文件中提取大部分信息
我希望这是有道理的。我花了相当多的时间尝试各种方法,但我的排序或遍历树永远不会成功,我得到重复的根信息值。我可以让它以时尚的方式发挥作用。如果我在容器上执行for-each,从树的底部开始,然后使用模板从上到下工作。从MSGHEADER返回到CONTANER。当货车没有集装箱时,这给我留下了一个问题。他们错过了。当我对货车进行节点检查测试,看看哪个没有容器和调用模板时,它没有像我希望的那样运行。
我的代码示例。
<xsl:template match="/MESSAGE">
<xsl:for-each select="//CONTAINER" >
{<xsl:call-template name="messageIdentifier" />;
<xsl:call-template name="FormatDate"><xsl:with-param
name="DateTime"select="/MESSAGE/MSGHEADER/MSGDTM"/>;
<xsl:call-template name="stowagePosition">
<xsl:with-param select="STATUS/WAGONS/WAGON/CONTAINERS/CONTAINER/ISO"
name="ISO"></xsl:with-param><xsl:with-param
select="/MESSAGE/STATUS/WAGONS/WAGON/WAGONCLASS" name="wagonClass"></xsl:with-param>
<xsl:with-param select="/MESSAGE/STATUS/WAGONS/WAGON/CONTAINERS/CONTAINER/WAGONPOS"
name="wagonPos"></xsl:with-param></xsl:call-template><xsl:value-of
select="CONTAINERID"/>;<xsl:value-of select="WAGONPOS"/>}</xsl:for-each>
<xsl:for-each select="//CONTAINERS" >
</xsl:template>
<MESSAGE>
<MSGHEADER>
<MSGVERSION>001</MSGVERSION>
<MSGID>DISCHARGE LIST</MSGID>
<MSGDTM>06 DEC 2012 04:17:18</MSGDTM>
<MSGSENDER>FL</MSGSENDER>
</MSGHEADER>
<CONTENT>
<TOCCODE>FL</TOCCODE>
<TOCREFERENCE>4MXXXXX</TOCREFERENCE>
</CONTENT>
<STATUS>
<SLOTARRIVAL>07 DEC 2012 12:09:00</SLOTARRIVAL>
<HEADCODE>4MXX</HEADCODE>
<ORIGINCODE>GBCBG</ORIGINCODE>
<WAGONS>
<WAGON>
<WAGONID>12345</WAGONID>
<WAGONORDER>1</WAGONORDER>
<WAGONCLASS>IKA</WAGONCLASS>
<CONTAINERS>
<CONTAINER>
<CONTAINERID>1000002</CONTAINERID>
<ISO>30XX</ISO>
<HAZ>N</HAZ>
</CONTAINER>
<CONTAINER>
<CONTAINERID>1000003</CONTAINERID>
<ISO>30S1</ISO>
<HAZ>N</HAZ>
</CONTAINER>
</CONTAINERS>
</WAGON>
<WAGON>
<WAGONID>12346</WAGONID>
<WAGONORDER>2</WAGONORDER>
<WAGONCLASS>IKA</WAGONCLASS>
<CONTAINERS>
<CONTAINER>
<CONTAINERID>1000004</CONTAINERID>
<ISO>30S2</ISO>
<HAZ>N</HAZ>
</CONTAINER>
<CONTAINER>
<CONTAINERID>1000005</CONTAINERID>
<ISO>45XX</ISO>
<HAZ>N</HAZ>
</CONTAINER>
</CONTAINERS>
</WAGON>
</STATUS>
</MESSAGE>