Получить значения из комбинации атрибутов / значений XML с использованием XSL - PullRequest
0 голосов
/ 30 июня 2018

Прежде всего, насколько мне известно, речь идет не только о преобразовании XML с использованием XSL. Речь идет о том, как XML представлен мне. Я искал все, что мог, но я не могу найти сценарий, похожий на тот, который у меня есть.

Источник XML:

<?xml version="1.0"?>
<RepData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Header>
        <requestId>2313022420.01</requestId>
        <requestTimeStamp>2018-JUN-30T06:13:40Z</requestTimeStamp>
    </Header>
    <responseProcessing>
        <translatorContext/>
        <styleSheet/>
    </responseProcessing>
    <serviceResponse>
        <Report docType="ACCOUNT">
            <dataSet name="ACCOUNT_DETS">
                <fieldDefinition index="1" id="ACCOUNT_ID" label="Account Number" type="ALPHANUMERIC" length="19" repeatable="FALSE"/>
                <fieldDefinition index="2" id="ACCOUNT_NAME" label="Account Name" type="ALPHANUMERIC" length="35" repeatable="FALSE"/>
                <fieldDefinition index="3" id="CURRENCY" label="Currency" type="ALPHANUMERIC" length="25" repeatable="FALSE"/>
                <fieldDefinition index="4" id="AMOUNT" label="Account Balance" type="ALPHANUMERIC" length="19" repeatable="FALSE"/>
                <record>
                    <field index="1">100004087</field>
                    <field index="2">MY EURO ACCOUNT</field>
                    <field index="3">Euro</field>
                    <field index="4">530,000</field>
                </record>
                <record>
                    <field index="1">200008169</field>
                    <field index="2">USD CASH ACCOUNT</field>
                    <field index="3">US Dollar</field>
                    <field index="4">2,924.82</field>
                </record>
            </dataSet>
        </Report>
    </serviceResponse>
</RepData>

Из источника поля определены под элементом fieldDefinition. И значения находятся в элементе field.

Я не могу найти способ перебирать поля, чтобы выбрать значения полей.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="RepData/serviceResponse/Report/dataSet/record" >
  <html>
  <body>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th>Account</th>
        <th>Balance</th>
      </tr>
      <xsl:for-each select="RepData/serviceResponse/Report/dataSet/record/field">
<p>
            <xsl:value-of select="RepData/serviceResponse/Report/dataSet/record/field" />
</p>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

Приведенный выше XSL возвращает только пустое значение, но если я добавлю 'mode="toc"' к сопоставлению всех данных, я получу дамп всех значений в xml:

2313022420.01 2018-JUN-30T06:13:40Z 100004087 MY EURO ACCOUNT Euro 530,000 200008169 USD CASH ACCOUNT US Dollar 2,924.82 

Это то, что я собираюсь (имена полей взяты из атрибута label в fieldDefinition):

Account Number|Account Name       |Currency  |Account Balance
100004087     |MY EURO ACCOUNT    |Euro      |530,000
200008169     |USD CASH ACCOUNT   |US Dollar |2,924.82

Ответы [ 2 ]

0 голосов
/ 30 июня 2018
<xsl:template match="RepData">
        <xsl:for-each select="serviceResponse/Report/dataSet">
            <table>
                <thead>
                    <tr bgcolor="green">
                        <xsl:for-each select="fieldDefinition">
                        <th>
                            <xsl:value-of select="@label"/>
                        </th>
                        </xsl:for-each>
                    </tr>
                </thead>
                <tbody>
                    <xsl:for-each select="record">
                    <tr bgcolor="blue">
                       <xsl:for-each select="field">
                            <td style="color:white;">
                                <xsl:value-of select="."/>
                            </td>     
                       </xsl:for-each>

                    </tr>
                    </xsl:for-each>
                </tbody>
            </table>
        </xsl:for-each>
    </xsl:template>
0 голосов
/ 30 июня 2018

Неверное соответствие шаблона и внутренний цикл for-each. Чтобы получить таблицу HTML, вы можете внести следующие изменения.

Предполагая, что количество field элементов в record совпадает с количеством fieldDefinition элементов (в данном случае 4), вы можете использовать приведенный ниже шаблон. Для получения выходных данных может быть несколько вариантов, и здесь я использовал несколько циклов for-each. Вы также можете использовать шаблонный подход, чтобы получить вывод.

<!-- Template match with document root element  -->
<xsl:template match="/">
    <html>
        <body>
            <table border="1">
                <tr bgcolor="#9acd32">
                    <!-- Loop to generate the header row of the table -->
                    <xsl:for-each select="RepData/serviceResponse/Report/dataSet/fieldDefinition">
                        <th><xsl:value-of select="@label" /></th>
                    </xsl:for-each>
                </tr>
                <!-- Loop for each "record" -->
                <xsl:for-each select="RepData/serviceResponse/Report/dataSet/record">
                    <tr>
                        <!-- Loop for each column below the header -->
                        <xsl:for-each select="field">
                            <td><xsl:value-of select="." /></td>
                        </xsl:for-each>
                    </tr>
                </xsl:for-each>
            </table>
        </body>
    </html>
</xsl:template>

выход

HTML Table

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