Вложенный запрос XPath - PullRequest
       22

Вложенный запрос XPath

1 голос
/ 12 марта 2020

Yay. Бухгалтерский учет: |

У меня есть набор учетных записей; они приходят парами - 1 дебет и 1 кредит. Две записи имеют одинаковые значения <SequenceID>. Я хочу обе записи, если одна из записей ссылается на учетную запись 1111.

Используемый (нерабочий) запрос (который я свободно основал на [ XPath. Выберите узлы на основе других, связанных узел ):

GLPostings/GLTransaction[GLPostings/GLTransaction[AccountCode = '1111']/SequenceID = SequenceID]

, но я получаю "возвращена пустая последовательность".

Если я тестирую часть запроса: GLPostings/GLTransaction[AccountCode = '1111']/SequenceID Я получаю несколько SequenceID, как и ожидалось. Итак ... как мне превратить эти множественные идентификаторы SequenceID в набор узлов, которые мне нужны?

Вот некоторые тестовые данные:

<?xml version="1.0" encoding="UTF-8"?>
<GLPostings>
   <GLTransaction RowNumber="1">
      <CRDR>Dr</CRDR>
      <SequenceID>616</SequenceID>
      <AccountCode>5531</AccountCode>
   </GLTransaction>
   <GLTransaction RowNumber="2">
      <CRDR>Cr</CRDR>
      <SequenceID>616</SequenceID>
      <AccountCode>2118</AccountCode>
   </GLTransaction>
   <GLTransaction RowNumber="3">
      <CRDR>Dr</CRDR>
      <SequenceID>617</SequenceID>
      <AccountCode>1111</AccountCode>
   </GLTransaction>
   <GLTransaction RowNumber="4">
      <CRDR>Cr</CRDR>
      <SequenceID>617</SequenceID>
      <AccountCode>1234</AccountCode>
   </GLTransaction>
   <GLTransaction RowNumber="5">
      <CRDR>Dr</CRDR>
      <SequenceID>618</SequenceID>
      <AccountCode>1231</AccountCode>
   </GLTransaction>
   <GLTransaction RowNumber="6">
      <CRDR>Cr</CRDR>
      <SequenceID>618</SequenceID>
      <AccountCode>1231</AccountCode>
   </GLTransaction>
   <GLTransaction RowNumber="7">
      <CRDR>Dr</CRDR>
      <SequenceID>619</SequenceID>
      <AccountCode>2341</AccountCode>
   </GLTransaction>
   <GLTransaction RowNumber="8">
      <CRDR>Cr</CRDR>
      <SequenceID>619</SequenceID>
      <AccountCode>1111</AccountCode>
   </GLTransaction>
</GLPostings>

Что я хотел бы получить, так это :

   <GLTransaction RowNumber="3">
      <CRDR>Dr</CRDR>
      <SequenceID>617</SequenceID>
      <AccountCode>1111</AccountCode>
   </GLTransaction>
   <GLTransaction RowNumber="4">
      <CRDR>Cr</CRDR>
      <SequenceID>617</SequenceID>
      <AccountCode>1234</AccountCode>
   </GLTransaction>
   <GLTransaction RowNumber="7">
      <CRDR>Dr</CRDR>
      <SequenceID>619</SequenceID>
      <AccountCode>2341</AccountCode>
   </GLTransaction>
   <GLTransaction RowNumber="8">
      <CRDR>Cr</CRDR>
      <SequenceID>619</SequenceID>
      <AccountCode>1111</AccountCode>
   </GLTransaction>

Любые намеки с благодарностью.

РЕДАКТИРОВАТЬ: Я могу решить эту проблему так:

<xsl:for-each select="/GLPostings/GLTransaction[AccountCode = 1111']/SequenceID">
    <xsl:variable name="Seq" select="."/>
    <xsl:for-each select="/GLPostings/GLTransaction[SequenceID = $Seq]">
         <xsl:call-template name="output-row">
        </xsl:call-template>
    </xsl:for-each>          
</xsl:for-each>  

Но это кажется немного ... грязным.

Ответы [ 2 ]

0 голосов
/ 12 марта 2020
/GLPostings/GLTransaction[AccountCode=1111][SequenceID[.=following::SequenceID or .=preceding::SequenceID]]

получит GLTransaction узлы, у которых AccountCode дочерний элемент равен 1111, а чей SequenceID дочерний элемент равен предшествующим или следующим SequenceID узлам

/GLPostings/GLTransaction[SequenceID[.=following::SequenceID[./following-sibling::AccountCode=1111] or .=preceding::SequenceID[./following-sibling::AccountCode=1111]]]

, получит GLTransaction узлов чей SequenceID child равен предшествующим или следующим SequenceID узлам, которые имеют AccountCode follow-sibling, равный 1111

, объединяют эти xpath в:

/GLPostings/GLTransaction[AccountCode=1111][SequenceID[.=following::SequenceID or .=preceding::SequenceID]]|/GLPostings/GLTransaction[SequenceID[.=following::SequenceID[./following-sibling::AccountCode=1111] or .=preceding::SequenceID[./following-sibling::AccountCode=1111]]]

получит вы ваши 4 узла (проверено на xpathtester.com)

0 голосов
/ 12 марта 2020

РЕДАКТИРОВАТЬ: Пересмотренный XPath

//AccountCode[.="1111"]/parent::*|//AccountCode[following::AccountCode[1]="1111" and following::SequenceID[1]=preceding::SequenceID[1]]/parent::*|//AccountCode[preceding::AccountCode[1]="1111" and preceding::SequenceID[2]=preceding::SequenceID[1]]/parent::*

Более безопасный вариант (если у вас нет двух последовательных SequenceID):

//AccountCode[.="1111"][following::SequenceID[1]=preceding::SequenceID[1]]/parent::*|//AccountCode[.="1111"][preceding::SequenceID[2]=preceding::SequenceID[1]]/parent::*|//AccountCode[following::AccountCode[1]="1111" and following::SequenceID[1]=preceding::SequenceID[1]]/parent::*|//AccountCode[preceding::AccountCode[1]="1111" and preceding::SequenceID[2]=preceding::SequenceID[1]]/parent::*
...