Как я могу получить все значения из вложенного XML? - PullRequest
0 голосов
/ 16 мая 2018

Я получаю ответ, подобный следующему, где я получаю несколько контрактов внутри контрактов. В ответе может быть 4, 3 или 5 контрактов. Я хочу получить значения всех ContractStartDate в каждом контракте.

<Contracts xmlns="http://www.ggmd.nl/data/service/kpicontract">
   <Contract>
      <ContractStartDate>2015-01-01+01:00</ContractStartDate>
      <ContractEndDate>2015-01-10+01:00</ContractEndDate>
      <ContractSubject>02 - 0H304</ContractSubject>
   </Contract>
  <Contract>
      <ContractStartDate>2017-01-01+01:00</ContractStartDate>
      <ContractEndDate>2017-01-10+01:00</ContractEndDate>
      <ContractSubject>02 - 0H304</ContractSubject>
   </Contract>
 <Contract>
      <ContractStartDate>2017-01-01+01:00</ContractStartDate>
      <ContractEndDate>2017-01-10+01:00</ContractEndDate>
      <ContractSubject>02 - 0H304</ContractSubject>
   </Contract>
</Contracts>

EDIT Я хочу вот так:

<Dates>
<ContractStartDate>2015-01-01+01:00</ContractStartDate>
<ContractStartDate>2017-01-01+01:00</ContractStartDate>
<ContractStartDate>2017-01-01+01:00</ContractStartDate>
</Dates

Как я могу получить все значения каждого ContractStartDate в wso2 esb с помощью xpath или xslt или сценария любого возможного решения?

1 Ответ

0 голосов
/ 16 мая 2018

Поскольку вы не указали ожидаемый результат, я предоставлю вам XPATH решение для извлечения <ContractStartDate> узлов из вашего файла:

Ввод:

more contracts.xml
<Contracts xmlns="http://www.ggmd.nl/data/service/kpicontract">
   <Contract>
      <ContractStartDate>2015-01-01+01:00</ContractStartDate>
      <ContractEndDate>2015-01-10+01:00</ContractEndDate>
      <ContractSubject>02 - 0H304</ContractSubject>
   </Contract>
  <Contract>
      <ContractStartDate>2017-01-01+01:00</ContractStartDate>
      <ContractEndDate>2017-01-10+01:00</ContractEndDate>
      <ContractSubject>02 - 0H304</ContractSubject>
   </Contract>
 <Contract>
      <ContractStartDate>2017-01-01+01:00</ContractStartDate>
      <ContractEndDate>2017-01-10+01:00</ContractEndDate>
      <ContractSubject>02 - 0H304</ContractSubject>
   </Contract>
</Contracts>

XPATH1: -> доступ ко всем ContractStartDate узлам в дереве XML DOM

/*[local-name()='Contracts']/*[local-name()='Contract']/*[local-name()='ContractStartDate']

ВЫХОД1:

<ContractStartDate>2015-01-01+01:00</ContractStartDate><ContractStartDate>2017-01-01+01:00</ContractStartDate><ContractStartDate>2017-01-01+01:00</ContractStartDate>

XPATH2: -> доступ ко всем текстовым полям ContractStartDate узлов в дереве XML DOM

/*[local-name()='Contracts']/*[local-name()='Contract']/*[local-name()='ContractStartDate']/text()

ВЫХОД2:

2015-01-01+01:002017-01-01+01:002017-01-01+01:00

после того, как, если вам нужно отформатировать вывод, как вы хотите, вы можете использовать этот конкретный XPATH в вашей XSLT таблице стилей

Если вы хотите получить определенный вами вывод, вам нужно использовать следующее XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:redirect="http://xml.apache.org/xalan/redirect" extension-element-prefixes="redirect" xmlns:xalan="http://xml.apache.org/xslt" exclude-result-prefixes="xalan">
<xsl:output method="xml" indent="yes" xalan:indent-amount="4"/>
<xsl:strip-space elements="*" />

<xsl:template match="/">
        <dates>
        <xsl:for-each select="/*[local-name()='Contracts']/*[local-name()='Contract']/*[local-name()='ContractStartDate']">
                <ContractStartDate>
                        <xsl:value-of select="." />
                </ContractStartDate>
        </xsl:for-each>
        </dates>
</xsl:template>

</xsl:stylesheet>

На ваш вход выдает:

$xsltproc contracts.xslt contracts.xml
<?xml version="1.0"?>
<dates>
  <ContractStartDate>2015-01-01+01:00</ContractStartDate>
  <ContractStartDate>2017-01-01+01:00</ContractStartDate>
  <ContractStartDate>2017-01-01+01:00</ContractStartDate>
</dates>
...