Мой XSL не представляет данные в XML - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь выполнить xsl для представления моего xml-файла, но он не показывает данные в xml-файле.

XSL

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"
xmlns:datetime="http://exslt.org/dates-and-times">

<xsl:template match="/">
    <html>
        <body>
            <h2>Maçã de Moimenta</h2>

            <div>
                <xsl:for-each select="moimenta/produtores">

                    <!-- 1º tabela -->

                    <table border="1">
                        <tr bgcolor="#9acd32">
                            <th>Relatório: CC / Fornecedor: </th>
                            <th>Data: </th>
                            <th>Ano Fiscal: </th>
                            <th>Colheita: </th>
                            <th>Qualidade da Maça: </th>
                        </tr>

                        <tr>
                            <td/>
                            <td>
                                <xsl:value-of select="produtor/nome"/>
                            </td>
                            <td>
                                <xsl:value-of select="datetime:dateTime()"/>
                            </td>
                            <td>></td>
                            <td>
                                <xsl:value-of select="produtor/colheita/@ano"/>
                            </td>
                            <td>
                                <xsl:value-of select="produtor/colheita/cod_colheita"/>
                            </td>
                            <td>
                                <xsl:value-of select="produtor/colheita/@qualidade"/>
                            </td>
                        </tr>

                    </table>

                    <!-- Tabela Dados da calibragem -->

                    <div> Dados de Calibragem: </div>
                    <div>
                        <table border="1">

                            <tr>
                                <th>Número do Lote:</th>
                                <th>Quantidade Total:</th>
                                <xsl:for-each select="produtor/colheita">
                                    <th>Calibragem: <xsl:value-of
                                            select="valor/preço_valor/@valor"/></th>
                                </xsl:for-each>
                            </tr>

                            <xsl:for-each select="produtor/colheita/lotes">

                                <tr>
                                    <td>
                                        <xsl:value-of select="lote/n_lote"/>
                                    </td>

                                    <xsl:for-each select="lote/calibragem">
                                        <td>
                                            <xsl:value-of select="calib/quantidade"/>
                                        </td>
                                    </xsl:for-each>
                                </tr>

                            </xsl:for-each>

                        </table>

                        <!-- FALTA INFORMAÇÃO SOBRE O QUE FALTA CALIBRAR -->
                    </div>


                    <!-- Tabela Resumo -->

                    <div>Resumo: </div>

                    <table border="1">

                        <tr>
                            <th>Número do Lote:</th>
                            <th>Calibragem:</th>
                            <th>Percentagem:</th>
                        </tr>

                        <xsl:for-each select="produtor/colheita/lotes">

                            <tr>
                                <!-- coloquei 5 porque restringi os valores de calibragem até 4 valores -->
                                <th rowspan="5">
                                    <xsl:value-of select="lote/n_lote"/>
                                </th>
                            </tr>
                            <xsl:for-each select="lote">
                                <tr>
                                    <th>
                                        <xsl:value-of select="calibragem/calib/@valor"/>
                                    </th>
                                    <th><xsl:value-of
                                            select="(calibragem/calib/quantidade div quantidade) * 100"
                                        />%</th>
                                </tr>
                            </xsl:for-each>

                        </xsl:for-each>

                    </table>


                </xsl:for-each>
            </div>
        </body>
    </html>
</xsl:template>

XML-файл

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="style_macaMoimenta.xsl"?>
<moimenta xmlns="http://www.macamoimenta.pt/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:gnr="http://www.macamoimenta.pt/general" xmlns:clt="http://www.macamoimenta.pt/lote"
xmlns:prc="http://www.macamoimenta.pt/precario"
xmlns:clb="http://www.macamoimenta.pt/calibragem"
xsi:schemaLocation="http://www.macamoimenta.pt/ moimenta.xsd">
<produtores>
    <produtor>
        <codigo>PR001</codigo>
        <nome>Antonio Manuel</nome>
        <data_registo>2018-03-20</data_registo>
        <morada>
            <gnr:rua>Rua Antonio Manuel</gnr:rua>
            <gnr:numero>69</gnr:numero>
            <gnr:cod_postal>4569-123</gnr:cod_postal>
        </morada>
        <colheita ano="2018" qualidade="Ambrosia">
            <cod_colheita>FE23569</cod_colheita>
            <valor>
                <prc:preco_valor valor="0-60">
                    <prc:preco>0.10</prc:preco>
                </prc:preco_valor>
                <prc:preco_valor valor="60-65">
                    <prc:preco>0.13</prc:preco>
                </prc:preco_valor>
                <prc:preco_valor valor="65-70">
                    <prc:preco>0.17</prc:preco>
                </prc:preco_valor>
                <prc:preco_valor valor="DEFEITO">
                    <prc:preco>0.05</prc:preco>
                </prc:preco_valor>
            </valor>
            <lotes>
                <lote>
                    <clt:n_lote>236598</clt:n_lote>
                    <clt:quantidade>2500</clt:quantidade>
                    <clt:calibragem>
                        <clb:calib valor="0-60">
                            <clb:quantidade>1000</clb:quantidade>
                        </clb:calib>
                        <clb:calib valor="60-65">
                            <clb:quantidade>1300</clb:quantidade>
                        </clb:calib>
                        <clb:calib valor="DEFEITO">
                            <clb:quantidade>200</clb:quantidade>
                        </clb:calib>
                    </clt:calibragem>
                </lote>
            </lotes>
        </colheita>
    </produtor>
</produtores>
</moimenta>

В основном мне просто нужно показать некоторую информацию о том, что она находится в xml в файле xsl. Вы можете понять по тому, что я запрашиваю для показа файла xsl вместе с xml, я не знаю, почему он не показывает то, что мне нужно. Можете ли вы помочь мне, пожалуйста ???

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

XSLT и XQuery совместно используют XPath в качестве языка выражений, и в Мой запрос не представил результаты xml , вы уже узнали, что выражение пути, такое как moimenta/produtores, выбирает элементы этих имен без пространства имен, если ваш XML не имеет объявления пространства имен `xmlns =" ​​http://www.macamoimenta.pt/" по умолчанию.

В XSLT 2 или 3 вы можете настроить, например, xpath-default-namespace="http://www.macamoimenta.pt/" (см. https://www.w3.org/TR/xslt20/#unprefixed-qnames), чтобы изменить это.

Как и в XQuery, если у вас есть входные документы с элементами из другого пространства имен (например, ваши элементы prc:preco_valor), вам необходимо также объявить их в XSLT, чтобы выбрать их в этом пространстве имен.

0 голосов
/ 03 сентября 2018

У вас проблемы с пространствами имен - вы их не учитываете.
И у вас есть проблема с вашей версией XSLT:
вы используете exslt функции в таблице стилей XSLT-1.0.
Вы не можете этого сделать, потому что большинство браузеров (к сожалению) поддерживают только строгую версию 1.0. Как правило, функции exslt поддерживаются не всеми браузерами, поэтому их необходимо удалить / преобразовать.

Устраняя обе проблемы, XML может выглядеть следующим образом (частичный ответ):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:pt="http://www.macamoimenta.pt/"                              <!-- Adding root stylesheet with prefix 'pt' -->
exclude-result-prefixes="xs" version="1.0"
xmlns:datetime="http://exslt.org/dates-and-times">

<xsl:template match="/">
    <html>
        <body>
            <h2>Maçã de Moimenta</h2>    
            <div>
                <xsl:for-each select="pt:moimenta/pt:produtores">   <!-- Use namespaces -->
...
            <td>
              <xsl:value-of select="datetime:dateTime()"/>          <!-- this empression has to be replaced by an XSLT-1.0 compatible version -->
            </td>
...

Если вы можете исправить эти проблемы, таблица стилей / XML должна работать.

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