XSLT: проблема с элементом <xsl:choose>

Недавно я начал работать с XML и XSLT и столкнулся с проблемой, которую не могу решить.

У меня есть проект, в котором мне нужно создать XSLT, который работает с тремя разными объектами в XML.

Объекты являются экспозициями.

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

 <?xml version = "1.0" encoding = "UTF-8"?>
<?xml-stylesheet type = "text/xsl" href = "exposição.xsl"?>
<museu xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation = "exp.xsd">
    <exposicoes>
        <presente titulo = "Exposições Atuais">
            
          <!-- Exposition_A-->  
            <exposicao titulo = "Vamos dar vida à Sala Patiño">  
                <imagem ficheiro = "http://museudearteantiga.pt/content/img/sala_patino.jpg" width = "600" height = "350"/>
                <descricao>
                    <objetivo>Restauro da Sala</objetivo>
                    <texto titulo = "Apresentação do Projeto">
                     ...
                     </texto>   
                </descricao>
                <!--Caracteristics_A-->
                <dados_exp>
                    <caracteristicas nome = "Sala Palatiño">
                        <estilo>Artes Decorativas Francesas</estilo>
                        <inauguração data = "ano">1974</inauguração>
                        <doador> Antenor Patiño</doador>
                        <data_criação data = "ano">1769</data_criação>
                        <criador>J. G. Leithner</criador>
                        <inspiração>Palácio de Paar</inspiração>
                        <arquiteto>Isidore Canevale</arquiteto>
                        <objetos>
                            <objeto>Conjunto de móveis de assento |</objeto>
                            <objeto>Guarnição de chaminé |</objeto>
                            <objeto>Tapete |</objeto>
                            <objeto>Lustre |</objeto>
                            <objeto>Relógio de parede |</objeto>
                            <objeto>Par de cómodas |</objeto>
                            <objeto>Vasos de Saxe</objeto>
                        </objetos>    
                    </caracteristicas>
                </dados_exp>
                <inf_adicionais>
                <data>
                    <inicio>
                        <dia>30</dia>
                        <mes>10</mes>
                        <ano>2018</ano>
                    </inicio>
                    <fim>
                        <dia>31</dia>
                        <mes>12</mes>
                        <ano>2020</ano>
                    </fim>
                </data>
                <local>
                    <piso>1</piso>
                    <sala>66</sala>
                </local>
                <doacao>    
                  <pagamento modalidade = "dinheiro"> Museu Nacional de Arte Antiga (caixas do GAMNAA)</pagamento>
                  <pagamento modalidade = "transferência bancária">Grupo dos Amigos do Museu Nacional de Arte Antiga
                      <iban>PT50 0036 0458 99106001472 91</iban>
                      <BIC_SWIFT>MPIOPTPL</BIC_SWIFT>
                  </pagamento>
                    <contacto>
                        <email>[email protected]</email>
                        <dados_necessarios>nome, morada, NIF e enviar comprovativo da comparticipação</dados_necessarios>
                    </contacto>
                    <nota>todos os doadores serão considerados anónimos, exceto aqueles que expressarem a vontade de serem identificados, apresentando comprovativo da comparticipação.</nota>
                </doacao>
             </inf_adicionais>
            </exposicao>
            
            
           <!--Exposition_B--> 
            <exposicao titulo = "Todos Somos Mecenas">  
                <imagem ficheiro = "http://museudearteantiga.pt/content/img/expo_capela.jpg" width = "600" height = "350"/>
                <descricao>
                    <objetivo>Restauro da Convento de Santo Alberto</objetivo>
                    <texto titulo = "Apresentação do Projeto">
                       ...
                    </texto> 
                </descricao>
                <!--Caracteristics_B-->
                <dados_exp>
                    <caracteristicas nome = "Convento Santo Alberto" nome_popular = "Capela das Albertas">
                        <estilo>Barroco Português</estilo>
                        <inauguração data = "ano">1585</inauguração>
                        <data_criação data = "ano"></data_criação>
                        <ordem_religiosa>Ordem das Camelitas</ordem_religiosa>
                        <objetos>        
                            <objeto>Talha dourada |</objeto>
                            <objeto>Azulejos</objeto>
                        </objetos>
                        <destaques>
                            Sumptuoso interior Arquitetura Pintura Escultura Artes Decorativas
                        </destaques>        
                    </caracteristicas>
                </dados_exp>
                <inf_adicionais>
                    <data>
                        <inicio>
                            <dia>01</dia>
                            <mes>12</mes>
                            <ano>2018</ano>
                        </inicio>
                        <fim>
                            <dia>31</dia>
                            <mes>12</mes>
                            <ano>2020</ano>
                        </fim>
                    </data>
                    <local>
                        <piso>1/Capela das Albertas</piso>
                    </local>
                    <doacao>    
                        <pagamento modalidade = "dinheiro"> Museu Nacional de Arte Antiga (caixas do GAMNAA)</pagamento>
                        <pagamento modalidade = "transferência bancária">Grupo dos Amigos do Museu Nacional de Arte Antiga
                            <iban>PT50 0036 0458 99106001472 91</iban>
                            <BIC_SWIFT>MPIOPTPL</BIC_SWIFT>
                        </pagamento>
                        <contacto>
                            <email>[email protected]</email>
                            <dados_necessarios>nome, morada, NIF e enviar comprovativo da comparticipação</dados_necessarios>
                        </contacto>
                        <nota>todos os doadores serão considerados anónimos, exceto aqueles que expressarem a vontade de serem identificados,
                            apresentando comprovativo da comparticipação.</nota>
                    </doacao>
                </inf_adicionais>
            </exposicao>
            
            
            
            <!--Exposition-C-->
            <exposicao titulo = "Estudo, Conservação e Restauro dos Painéis de São Vicente">
                <imagem ficheiro = "http://museudearteantiga.pt/content/img/paineis_800x450.jpg" width = "600" height = "350"/>
                <descricao>
                    <objetivo>Conservação e restauro dos painéis</objetivo>
                    <texto titulo = "Apresentação do Projeto">
                        ...
                    </texto>                      
                </descricao>
                
                <!--Caracteristics_C-->
                <dados_exp>
                    <caracteristicas nome = "Paineis de São Vicente">
                        <estilo>Realista</estilo>
                        <inauguração data = "ano">2020</inauguração>
                        <data_criação data = "século">XV</data_criação>
                        <objetos>
                            <objeto>Painel dos Frades |</objeto>
                            <objeto>Painel dos Pescadores |</objeto>
                            <objeto>Painel do Infante |</objeto>
                            <objeto>Painel do Arcebispo |</objeto>
                            <objeto>Painel dos Cavaleiros |</objeto>
                            <objeto>Painel da Relíquia </objeto>
                        </objetos>
                    </caracteristicas>
                </dados_exp>
                <inf_adicionais>
                    <data>
                        <inicio>
                            <dia>01</dia>
                            <mes>06</mes>
                            <ano>2020</ano>
                        </inicio>
                        <fim>
                            <dia>18</dia>
                            <mes>05</mes>
                            <ano>2022</ano>
                        </fim>
                    </data>
                    <local>
                        <piso>3</piso>
                    </local>
                    <mecenas nome = "Fundação Millennium BCP">
                        <imagem ficheiro = "logo_fundação_millennium_bcp.jpg" width= "200" height= "135" />            
                        <texto titulo = "Sobre a  Fundação Millennium bcp">
                           ...
                        </texto>
                    </mecenas>
                </inf_adicionais>
            </exposicao>
        </presente>
    </exposicoes>
</museu>

А вот эти элементы в XSLT (обновлено):

<? 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">
  <xsl: output method = "html" />
  <xsl: template match = "/">
    <xsl: for-each select = "/ museum / exposition / present / exposition">
    <xsl: result-document method = "html" href = "exposition _ {@ title} .html">
       
  <html>
   <head>
    <title> National Museum of Ancient Art </title>
     <link rel = "stylesheet" type = "text / css" href = "201906497.css" />
     <meta name = "viewport" content = "width = device-width, initial-scale = 1.0" />
     <script src = "https://kit.fontawesome.com/802bcd581f.js" crossorigin = "anonymous"> </script>
   </head>
        
   <body>
     <div class = "header">
                ...
       <div class = "navbar">
            ...
       </div>
         <! - Exhibition ->
        <div class = "secheader">
         <h1 class = "title2" id = "tbpag3"> <xsl: value-of select = "@ title" /> </h1>
       </div>
        <! - End of Header ->
            
       <div class = "data_exp">
       <div class = "img_sp">
         <img src = "{image / @ file}" width = "600" height = "350" />
       </div>
       <div class = "box1">
         <p> <strong> Objective | </strong> <xsl: value-of select = "description / objective" /> </p>
         <p class = "exp1">
            <xsl: value-of select = "description / text" />
                    </p>
                </div>
            </div>
               
            <div class = "dados_exp">
                <h3>Dados da Exposição</h3>
                
               
                <p><strong> Estilo| </strong>
                <xsl:choose>
                    <xsl:when test = "normalize-space(estilo) = ''"> Informação Indisponível
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:value-of select = "dados_exp/caracteristicas/estilo"/>
                    </xsl:otherwise>
                </xsl:choose></p>
                
                
                <p><strong>Inauguração|</strong>
                <xsl:choose>
                    <xsl:when test = "normalize-space(inauguração)=''"> Informação Indisponível
                    </xsl:when>
                    <xsl:otherwise>
                       <xsl:value-of select = "dados_exp/caracteristicas/inauguração"/>
                    </xsl:otherwise>   
                </xsl:choose></p>
                
                
                
                <p><strong> Doador| </strong>
                <xsl:choose>
                    <xsl:when test = "normalize-space(doador)=''"> Informação Indisponível    
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:value-of select = "dados_exp/caracteristicas/doador"/> 
                    </xsl:otherwise>
                 </xsl:choose></p>
                
                
                
                <p><strong> Data de Criação| </strong>
                    <xsl:choose>
                        <xsl:when test = "normalize-space(data_criação)=''"> Informação Indisponível  
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:value-of select = "dados_exp/caracteristicas/data_criação"/> 
                        </xsl:otherwise>
                    </xsl:choose></p>
                    
                
                
                
                <p><strong> Autor| </strong>
                    <xsl:choose>
                        <xsl:when test = "normalize-space(criador)=''"> Informação Indisponível   
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:value-of select = "dados_exp/caracteristicas/criador"/> 
                        </xsl:otherwise>
                    </xsl:choose></p>
                
                
                
                <p><strong> Inspiração| </strong>
                    <xsl:choose>
                        <xsl:when test = "normalize-space(inspiração)=''"> Informação Indisponível    
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:value-of select = "dados_exp/caracteristicas/inspiração"/> 
                        </xsl:otherwise>
                    </xsl:choose></p>
                   
                    
                
                <p><strong> Arquiteto| </strong>
                    <xsl:choose>
                        <xsl:when test = "normalize-space(arquiteto)=''"> Informação Indisponível 
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:value-of select = "dados_exp/caracteristicas/arquiteto"/> 
                        </xsl:otherwise>
                    </xsl:choose></p>
                
                
                
                <p><strong> Ordem Religiosa| </strong>
                    <xsl:choose>
                        <xsl:when test = "normalize-space(ordem_religiosa)=''"> Informação Indisponível   
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:value-of select = "dados_exp/caracteristicas/ordem_religiosa"/> 
                        </xsl:otherwise>
                    </xsl:choose></p>
                
                
                
                <p><strong> Objetos| </strong>
                    <xsl:choose>
                        <xsl:when test = "normalize-space(objeto)=''"> Informação Indisponível    
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:value-of select = "dados_exp/caracteristicas/objetos/objeto"/> 
                        </xsl:otherwise>
                    </xsl:choose></p>
                
             </div>
            
            ...
            
    </xsl:result-document>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Моя цель состояла бы в том, чтобы либо эти элементы исчезли, когда они не существуют в экспозиции, либо отображали текст «Информация недоступна» перед элементом HTML в XSLT. Я пробовал этот способ, но все, что у него осталось, это часть HTML без ничего впереди. Я был бы очень признателен за всю помощь, которую вы могли бы оказать. Спасибо.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
165
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обновлено:

Нижеследующее может сработать для вас.

<?xml version = "1.0" encoding = "ISO-8859-1"?>
<xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
    <xsl:output method = "xml" version = "1.0" encoding = "ISO-8859-1" indent = "yes"/>

    <xsl:template match = "/">
        <xsl:for-each select = "museu/exposicoes/presente/exposicao">
        <!-- here you may select all info beneath exposicao node -->
        <title>
            <xsl:value-of select = "@titulo"/>
        </title>
            
            <p>
                <strong> Style | </strong>
                <xsl:choose>
                    <xsl:when test = "normalize-space(dados_exp/caracteristicas/estilo) = ''"> Information Unavailable </xsl:when>
                    <xsl:otherwise>
                        <xsl:value-of select = "dados_exp/caracteristicas/estilo"/>
                    </xsl:otherwise>
                </xsl:choose>
            </p>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet> 

Я думаю, было бы лучше, если бы вы скопировали весь свой XSL. Возможно, то, что я сделал ниже, может помочь вам.

XML:

<characteristics name = "exp_C">
  <style> Realistic </style>
  <inauguration> 2020 </inauguration>
  <creation_data> XV </creation_data>
  <creator> Nuno Gonçalves </creator>
  <objects>
    <object> Panel of the Friars | </object>
    <object> Fishermen's Panel | </object>
    <object> Infante's Panel | </object>
    <object> Archbishop's Panel | </object>
    <object> Panel of the Knights | </object>
    <object> Relic Panel | </object>
  </objects>
</characteristics>

XSL:

<?xml version = "1.0" encoding = "ISO-8859-1"?>
<xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
    <xsl:output method = "xml" version = "1.0" encoding = "ISO-8859-1" indent = "yes"/>

    <xsl:template match = "characteristics">
        <p>
            <strong> Style | </strong>
            <xsl:choose>
                <xsl:when test = "normalize-space(style) = ''"> Information Unavailable </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select = "style"/>
                </xsl:otherwise>
            </xsl:choose>
        </p>
    </xsl:template>

</xsl:stylesheet> 

Результат:

<p><strong> Style | </strong> Realistic </p>

Привет. Спасибо за ваше понимание. Как вы и советовали, я обновил XSLT, чтобы в нем было столько информации, сколько я считаю необходимым. Я извиняюсь, если кода, который я предоставил ранее, было недостаточно, чтобы понять, как был сформулирован мой XSLT.

yelloow 12.12.2020 23:01

Что касается предоставленного вами решения, я попытался обновить свой код, но, к сожалению, проблема все еще сохраняется (текст «Информация недоступна» не появляется, когда элемент не существует в определенной экспозиции, например, в случае экспозиции B, где элемент «донор» не существует, что дает мне этот результат на выходе: Donor | , оставляя место, где должно быть «Информация недоступна», пустым).

yelloow 12.12.2020 23:15

Может быть, это потому, что узел не совсем пустой. Если у вас есть пробелы, это не пусто. Я отредактировал ответ, добавив функцию нормализации пространства в предложении when-test. Дайте мне знать, если это работает. Если это не сработает, убедитесь, что ваш шаблон соответствует «характеристикам» в начале.

Douglas Martins 13.12.2020 19:13

Спасибо за вашу помощь еще раз. Добавление функции normalize-space добавляет в вывод текст «Информация недоступна». Однако он появляется в любом случае, даже если элементы не пусты (где должен отображаться текст, определенный в XML).

yelloow 13.12.2020 20:01

Не могли бы вы также скопировать весь XML? Я думаю, причина в вашем "для каждого". Он составляется для каждого "/музея/экспозиции/подарка/экспозиции". XML-файлы, которые вы разместили ранее, имеют характеристики. Возможно, вам следует добавить новый для каждого или добавить характеристики к вашему текущему для каждого.

Douglas Martins 13.12.2020 20:41

Я обновил XML, и теперь доступна полная версия, хотя и не на английском языке из-за размера кода и важности сохранения одинаковых имен элементов. Надеюсь, это поможет.

yelloow 13.12.2020 21:06

Отлично, не проблема, я тоже из Бразилии, ха-ха. Я обновил XSL. Ваш путь был неправильным для проверки стиля. Ваш для каждого делается на "exposicao". Чтобы добраться до «estilo», вы можете зайти в «dados_exp/caracteristicas» раньше. Затем вы можете протестировать «estilo». Дайте мне знать, если это работает.

Douglas Martins 13.12.2020 21:25

Другие вопросы по теме