2011-09-16 38 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循環遍歷節點列表,並且您都是組。它根據您使用的語言而有所不同。