2011-09-16 65 views
2

我有下面显示的XML如果有人能告诉我如何首先选择Parcel元素,然后是DeliveryAddress元素,然后是Consignment元素,那么这些元素会在XML文档中重复如图所示。按相反顺序选择元素

<?xml version="1.0" encoding="utf-8"?> 
    <?xml-stylesheet type="text/xsl" href="mr23030b1.xsl"?> 
<MR23030B> 
    <Header RECORD_TYPE="HD" METER_NO="10800" FILE_DATE="23/06/2011"> 
    <SenderAddress RECORD_TYPE="AS" COUNTRY_CODE="GB" BRANCH_PREFIX="" BRANCH_CODE=""/> 
    <Consignment RECORD_TYPE="CO" ACNT_NO="044375530" COLL_PT="0001"/> 
    <DeliveryAddress RECORD_TYPE="AD" COUNTRY_CODE="GB" BRANCH_CODE="7255"/> 
    <Parcel RECORD_TYPE="PA" MANIFEST_NO="0000000000" PARCEL_NO="JD0002210800004322"/> 
    <Consignment RECORD_TYPE="CO" ACNT_NO="044375531" CONT_NO="9360964" /> 
    <DeliveryAddress RECORD_TYPE="AD" COUNTRY_CODE="GB" BRANCH_CODE="7256"/> 
    <Parcel RECORD_TYPE="PA" MANIFEST_NO="0000000000" PARCEL_NO="JD0002210800004323"/> 
    <Consignment RECORD_TYPE="CO" ACNT_NO="044375532" CONT_NO="9360964" /> 
    <DeliveryAddress RECORD_TYPE="AD" COUNTRY_CODE="GB" BRANCH_CODE="7257"/> 
    <Parcel RECORD_TYPE="PA" MANIFEST_NO="0000000000" PARCEL_NO="JD0002210800004324"/> 
    <TrailerRecord RECORD_TYPE="TR" NO_RECORDS="00000425"/> 
</MR23030B> 

我使用XSL样式表:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="MR23030B"> 
xsl:apply-templates/> 
</xsl:template> 
<xsl:output method='text'/> 

<xsl:variable name='newline'> 
<xsl:text>&#10;</xsl:text> 
</xsl:variable> 

<xsl:template match="MR23030B"> 
    <xsl:apply-templates select="/*/Parcel,/*/DeliveryAddress,/*/Consignment"/> 
</xsl:template> 

<xsl:template match="Parcel"> 
    <xsl:value-of select="@PARCEL_NO"/> 
    <xsl:value-of select="$newline"/> 
</xsl:template> 

<xsl:template match="DeliveryAddress"> 
<xsl:value-of select="@BRANCH_CODE"/> 
<xsl:value-of select="$newline"/> 
</xsl:template> 

<xsl:template match="Consignment"> 
<xsl:value-of select="@ACNT_NO"/> 
<xsl:value-of select="$newline"/> 
<xsl:value-of select="$newline"/> 
</xsl:template> 

我试过上述XSL样式表,但我仍然得到出来以错误的顺序,即其阅读寄售元素的数据首先是DeliveryAddress,最后是Parcel。即044375530 7255 JD0002210800004322 044375531 7256 JD0002210800004323 044375532 7257 JD0002210800004324

正如你所知我希望首先使用Parcel元素,然后是Delivery地址和Consignment元素。

如果有人能告诉我这个样式表有什么问题,我将不胜感激。

+0

用什么语言? –

+0

好问题,+1。这可以使用单个XPath 2.0表达式或几行XSLT 1.0代码完成。 –

回答

0

XPath 1.0在技术上返回没有定义顺序的节点集;但由于与XSLT的广泛关联,大多数XPath API可以依赖于以文档顺序交付节点集,即使API文档经常忘记提及事实。

要以文档顺序之外的任何其他方式传递节点序列,您需要XPath 2.0。这可以让你喜欢

/*/Parcel, /*/DeliveryAddress, /*/Consignment 

返回节点在任何你想要的顺序表达。 (虽然小心我编辑此答案之前犯了一个错误的:包含在文档顺序一个“/”返回结果的任何表达式)

3

在XPath 2.0

for $cnt in count($yourExpression), 
    $i in 0 to $cnt -1 
    return 
    $yourExpression[$cnt - $i] 

用XSLT 1.0(XPath 1.0)

<xsl:for-each select="$yourExpression"> 
    <xsl:sort select="position()" 
    data-type="number" order="descending"/> 

    <!--Process an individual node here --> 
    </xsl:for-each> 
0

这一切都取决于语言。但是通用算法是将所有“MR23030B”元素加载到一个列表中,并且仅向后遍历该列表。

所以我经常使用java.xml.xpath类。并加载所有节点我会使用像这样的表达式:“// MR23030B/descendant :: *”

然后,您只需使用for循环遍历节点列表,并且您都是组。它根据您使用的语言而有所不同。