Выберите элементы в обратном порядке - PullRequest
2 голосов
/ 16 сентября 2011

У меня есть 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 и, наконец, Посылка. т.е. 044375530 7255 JD0002210800004322 044375531 7256 JD0002210800004323 044375532 7257 JD0002210800004324

Как вы знаете, сначала я хочу указать элемент "Посылка", а затем адрес доставки и элемент "Отправка".

Буду очень признателен, если кто-нибудь скажет мне, что не так с таблицей стилей.

Ответы [ 3 ]

3 голосов
/ 17 сентября 2011

В 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 голосов
/ 17 сентября 2011

Все зависит от языка. Но общий алгоритм состоит в том, чтобы просто загрузить все элементы "MR23030B" в список и просто пройти этот список в обратном направлении.

Поэтому я часто использую класс java.xml.xpath. И чтобы загрузить все узлы, я бы использовал выражение вроде этого: "// MR23030B / downndant :: *"

Тогда вы просто используете цикл for, чтобы пройти список узлов назад, и все готово. Это зависит от языка, который вы используете.

0 голосов
/ 17 сентября 2011

XPath 1.0 технически возвращает наборы узлов, которые не имеют определенного порядка;но из-за широко распространенной ассоциации с XSLT можно полагаться на большинство API-интерфейсов XPath для доставки наборов узлов в порядке документа, даже если в документации API часто забывают упомянуть этот факт.

Для доставки последовательности узлов вчто-нибудь кроме порядка документов, вам нужен XPath 2.0.Это позволяет вам получить выражение типа

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

, которое возвращает узлы в любом порядке.(Остерегайтесь ошибки, которую я допустил перед редактированием этого ответа: любое выражение, содержащее «/», возвращает результаты в порядке документа.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...