XSLT для файла XML - PullRequest
       6

XSLT для файла XML

1 голос
/ 24 октября 2019

Я пытаюсь извлечь несколько тегов, используя XSLT, но теги получают пустое значение. Подскажите, пожалуйста, в чем проблема с кодом. Ниже приведен мой код:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html> 
<body>
  <h2>My Collection</h2>
  <table border="1">
    <tr bgcolor="#9acd32">
      <th style="text-align:left">ClientID</th>
      <th style="text-align:left">AssetClass</th>
    </tr>
    <tr>
      <td><xsl:value-of select="ClientID"/></td>
      <td><xsl:value-of select="AssetClass"/></td>
    </tr>

  </table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

Ниже приведен XML-код, из которого я пытаюсь извлечь данные.

    <?xml version="1.0"?>
<template123 xmlns="http://www.markit.com/totem/api/data/V40" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <ClientID>470</ClientID>
  <ValuationDate>2019-01-31</ValuationDate>
  <AssetClass>Value</AssetClass>
  <ServiceName>Oil</ServiceName>
  <ServiceFrequency>ME</ServiceFrequency>
  <SubArea>10</SubArea>
  <SchemaVersion>40</SchemaVersion>
  <Underlier>
    <ContractGroup>Chemicals</ContractGroup>
    <Currency>USD</Currency>
    <ReferencePublication1>XYZ</ReferencePublication1>
    <Underlying>ABC</Underlying>
    <Underlying1>ABC</Underlying1>
    <Instrument>
      <CCYScalar>1.0</CCYScalar>
      <EndDate>2019-02-28</EndDate>
      <InstrumentType>Watch</InstrumentType>
      <InstrumentType1>Watch</InstrumentType1>
      <Period>Month</Period>
      <PricingTime>LDN 16:30</PricingTime>
      <StartDate>2019-02-01</StartDate>
      <Units>MT</Units>
      <ClientPrice>472.84000000</ClientPrice>
    </Instrument>
    <Instrument>
      <CCYScalar>1.0</CCYScalar>
      <EndDate>2019-03-31</EndDate>
      <InstrumentType>Watch</InstrumentType>
      <InstrumentType1>Watch</InstrumentType1>
      <Period>Month</Period>
      <PricingTime>LDN 16:30</PricingTime>
      <StartDate>2019-03-01</StartDate>
      <Units>MT</Units>
      <ClientPrice>456.46600000</ClientPrice>
    </Instrument>
    <Instrument>
      <CCYScalar>1.0</CCYScalar>
      <EndDate>2019-04-30</EndDate>
      <InstrumentType>Watch</InstrumentType>
      <InstrumentType1>Watch</InstrumentType1>
      <Period>Month</Period>
      <PricingTime>LDN 16:30</PricingTime>
      <StartDate>2019-04-01</StartDate>
      <Units>MT</Units>
      <ClientPrice>440.30900000</ClientPrice>
    </Instrument>    
  </Underlier>  
</template123>

Пробовал с предложенным решением и смог получить родительские узлызначения, но вложенный узел все еще остается пустым.

Мой обновленный код:

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ab="http://www.markit.com/totem/api/data/V40">
    <xsl:output method="text" />
    <xsl:template match="ab:template">
        <xsl:text>ClientID|ValuationDate|AssetClass|ServiceName|ServiceFrequency|SubArea|SchemaVersion|ContractGroup|EndDate</xsl:text>
        <xsl:text>&#xa;</xsl:text>
        <xsl:value-of select="ab:ClientID" />
        <xsl:text>|</xsl:text>
        <xsl:value-of select="ab:ValuationDate" />
        <xsl:text>|</xsl:text>
        <xsl:value-of select="ab:AssetClass" />
        <xsl:text>|</xsl:text>
        <xsl:value-of select="ab:ServiceName" />
        <xsl:text>|</xsl:text>
        <xsl:value-of select="ab:ServiceFrequency" />
        <xsl:text>|</xsl:text>
        <xsl:value-of select="ab:SubArea" />
        <xsl:text>|</xsl:text>
        <xsl:value-of select="ab:SchemaVersion" />
        <xsl:text>|</xsl:text>
        <xsl:value-of select="ab:Underlier/ContractGroup" />
        <xsl:text>|</xsl:text>
        <xsl:value-of select="ab:Underlier/Instrument/EndDate" />
        <xsl:text>|</xsl:text>
    </xsl:template>

</xsl:stylesheet>

Я пытаюсь извлечь данные из этого XML и преобразовать их в файл, разделенный по конвейеру.

Можете ли вы предложить, что необходимо изменить для доступа к значениям из вложенных узлов.

Ожидаемый результат должен выглядеть следующим образом:

ClientID | ValuationDate | AssetClass | ServiceName | ServiceFrequency |SubArea | SchemaVersion | ContractGroup | EndDate 470 | 2019-01-31 | Значение | Нефть | ME | 10 | 40 | Химикаты | 2019-02-28 470 | 2019-01-31 | Значение | Нефть | ME | 10 | 40 |Chemicals | 2019-03-31

и т. Д. Для всех вложенных узлов.

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Вы можете попробовать это

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ab="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="ab">
    <xsl:template match="ab:template123">
        <html> 
            <body>
                <h2>My Collection</h2>
                <table border="1">
                    <tr bgcolor="#9acd32">
                        <th style="text-align:left">ClientID</th>
                        <th style="text-align:left">AssetClass</th>
                    </tr>
                    <tr>
                        <td><xsl:value-of select="ab:ClientID"/></td>
                        <td><xsl:value-of select="ab:AssetClass"/></td>
                    </tr>

                </table>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

DEMO https://xsltfiddle.liberty -development.net / 94AbWB2 XML-файл:

    <?xml version="1.0" encoding="UTF-8"?>
<template123 xmlns="http://www.markit.com/totem/api/data/V40" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <ClientID>470</ClientID>
    <ValuationDate>2019-01-31</ValuationDate>
    <AssetClass>Value</AssetClass>
    <ServiceName>Oil</ServiceName>
    <ServiceFrequency>ME</ServiceFrequency>
    <SubArea>10</SubArea>
    <SchemaVersion>40</SchemaVersion>
    <Underlier>
        <ContractGroup>Chemicals</ContractGroup>
        <Currency>USD</Currency>
        <ReferencePublication1>XYZ</ReferencePublication1>
        <Underlying>ABC</Underlying>
        <Underlying1>ABC</Underlying1>
        <Instrument>
            <CCYScalar>1.0</CCYScalar>
            <EndDate>2019-02-28</EndDate>
            <InstrumentType>Watch</InstrumentType>
            <InstrumentType1>Watch</InstrumentType1>
            <Period>Month</Period>
            <PricingTime>LDN 16:30</PricingTime>
            <StartDate>2019-02-01</StartDate>
            <Units>MT</Units>
            <ClientPrice>472.84000000</ClientPrice>
        </Instrument>
        <Instrument>
            <CCYScalar>1.0</CCYScalar>
            <EndDate>2019-03-31</EndDate>
            <InstrumentType>Watch</InstrumentType>
            <InstrumentType1>Watch</InstrumentType1>
            <Period>Month</Period>
            <PricingTime>LDN 16:30</PricingTime>
            <StartDate>2019-03-01</StartDate>
            <Units>MT</Units>
            <ClientPrice>456.46600000</ClientPrice>
        </Instrument>
        <Instrument>
            <CCYScalar>1.0</CCYScalar>
            <EndDate>2019-04-30</EndDate>
            <InstrumentType>Watch</InstrumentType>
            <InstrumentType1>Watch</InstrumentType1>
            <Period>Month</Period>
            <PricingTime>LDN 16:30</PricingTime>
            <StartDate>2019-04-01</StartDate>
            <Units>MT</Units>
            <ClientPrice>440.30900000</ClientPrice>
        </Instrument>    
    </Underlier>  
</template123>

XSLT:

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ab="http://www.markit.com/totem/api/data/V40">
    <xsl:output method="text" />
    <xsl:template match="ab:template123">
        <xsl:text>ClientID|ValuationDate|AssetClass|ServiceName|ServiceFrequency|SubArea|SchemaVersion|ContractGroup|EndDate</xsl:text>
        <xsl:text>&#xa;</xsl:text>
        <xsl:value-of select="ab:ClientID" />
        <xsl:text>|</xsl:text>
        <xsl:value-of select="ab:ValuationDate" />
        <xsl:text>|</xsl:text>
        <xsl:value-of select="ab:AssetClass" />
        <xsl:text>|</xsl:text>
        <xsl:value-of select="ab:ServiceName" />
        <xsl:text>|</xsl:text>
        <xsl:value-of select="ab:ServiceFrequency" />
        <xsl:text>|</xsl:text>
        <xsl:value-of select="ab:SubArea" />
        <xsl:text>|</xsl:text>
        <xsl:value-of select="ab:SchemaVersion" />
        <xsl:text>|</xsl:text>
        <xsl:value-of select="ab:Underlier/ab:ContractGroup" />
        <xsl:text>|</xsl:text>
        <xsl:value-of select="ab:Underlier/ab:Instrument/ab:EndDate" />
    </xsl:template>

</xsl:stylesheet>

ВЫХОД:

    ClientID|ValuationDate|AssetClass|ServiceName|ServiceFrequency|SubArea|SchemaVersion|ContractGroup|EndDate
470|2019-01-31|Value|Oil|ME|10|40|Chemicals|2019-02-28
0 голосов
/ 24 октября 2019

Похоже, что в вашем сценарии две вещи неправильны:

  1. Пространство имен по умолчанию в XML точно совпадает с пространством имен преобразований
  2. В контексте сопоставления вы находитесь на узле документа, поэтому либо вам нужночтобы использовать template123 в совпадении или в <xsl:value-of select="template123/ClientID"/> & <xsl:value-of select="template123/AssetClass"/>, вы указываете правильный путь для навигации по элементам.

Ниже приведен код, который вы можете использовать:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html> 
<body>
  <h2>My Collection</h2>
  <table border="1">
    <tr bgcolor="#9acd32">
      <th style="text-align:left">ClientID</th>
      <th style="text-align:left">AssetClass</th>
    </tr>
    <tr>
      <td><xsl:value-of select="template123/ClientID"/></td>
      <td><xsl:value-of select="template123/AssetClass"/></td>
    </tr>
  </table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

Вы можете увидеть эту ссылку для справки: https://xsltfiddle.liberty -development.net / 6rewNxZ / 1

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