Преобразование XML-таблицы nxm с помощью XSLT - PullRequest
0 голосов
/ 30 октября 2019

В моем приложении я получаю таблицу XML с переменным числом столбцов, которые я хочу преобразовать с помощью XSLT. Таблица имеет следующую структуру:

Я попытался преобразовать ее с помощью следующего XSLT

<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Body>
        <ns2:Informe xmlns:ns2="http://whateverUrl/" idOperacion="123456">
        <Resultset identificador="0" nombre="Nombre" numResult="1">
           <Header>
              <Columna tipo="VARCHAR">ColName1</Columna>
              <Columna tipo="VARCHAR">ColName2</Columna>
              <Columna tipo="VARCHAR">ColName3</Columna>
              <Columna tipo="VARCHAR">ColName4</Columna>
              <Columna tipo="VARCHAR">ColName5</Columna>
              <Columna tipo="VARCHAR">ColName6</Columna>
           </Header>
           <DataSet>
              <Fila>
                 <Campo>Val1</Campo>
                 <Campo>Val2</Campo>
                 <Campo>Val3</Campo>
                 <Campo>Val4</Campo>
                 <Campo>Val5</Campo>
                 <Campo>Val6</Campo>
              </Fila>
           </DataSet>
        </Resultset>
         </ns2:Informe>
    </S:Body>
</S:Envelope>

Я попытался преобразовать его с помощью следующего 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="S:Envelope/S:Body/ns2:Informe/">
<html>
<body>
  <h2>My Title</h2>
  <table border="1">

    <thead>
        <xsl:for-each select="/Resultset/Header/Columna">
            <tr>
                <th><xsl:value-of select="name()"/></th>
            </tr>
        </xsl:for-each>
    </thead>

    <tbody>
        <xsl:for-each select="/Resultset/DataSet/Fila">
            <tr>
                <td><xsl:value-of select="name()"/></td>
            </tr>
        </xsl:for-each>
    </tbody>
  </table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

Проблемы, которые я обнаружил в моем подходе к преобразованию: - template match не входит в указанные элементы XML. - Значение <td><xsl:value-of select="name()"/></td> в других сделанных мною испытаниях напечатало «Columna» вместо значения внутри элемента Column.

Поэтому мой вопрос: что я делаю неправильно, что непозвольте мне преобразовать эту входную XML-таблицу NXM с этим XSLT с учетом выявленных (и нерешенных) ошибок в моем подходе?

1 Ответ

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

Я предполагаю (трудно быть уверенным, когда в вашем примере XML есть только одна строка данных), что вы хотите сделать:

XSLT 1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns2="http://whateverUrl/">

<xsl:template match="/S:Envelope">
    <html>
        <body>
            <h2>My Title</h2>
            <table border="1">
                <thead>
                    <tr>
                        <xsl:for-each select="S:Body/ns2:Informe/Resultset/Header/Columna">
                            <th>
                                <xsl:value-of select="."/>
                            </th>
                        </xsl:for-each> 
                    </tr>
                </thead>
                <tbody>
                    <xsl:for-each select="S:Body/ns2:Informe/Resultset/DataSet/Fila">
                        <tr>
                            <xsl:for-each select="Campo">
                                <td>
                                    <xsl:value-of select="."/>
                                </td>
                            </xsl:for-each>
                        </tr>
                    </xsl:for-each>
                </tbody>
            </table>
        </body>
    </html>
</xsl:template>

</xsl:stylesheet>

Применительно к данному примеру XML это приведет к:

enter image description here

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