Недавно я начал работать с 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 без ничего впереди. Я был бы очень признателен за всю помощь, которую вы могли бы оказать. Спасибо.





Обновлено:
Нижеследующее может сработать для вас.
<?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>
Что касается предоставленного вами решения, я попытался обновить свой код, но, к сожалению, проблема все еще сохраняется (текст «Информация недоступна» не появляется, когда элемент не существует в определенной экспозиции, например, в случае экспозиции B, где элемент «донор» не существует, что дает мне этот результат на выходе: Donor | , оставляя место, где должно быть «Информация недоступна», пустым).
Может быть, это потому, что узел не совсем пустой. Если у вас есть пробелы, это не пусто. Я отредактировал ответ, добавив функцию нормализации пространства в предложении when-test. Дайте мне знать, если это работает. Если это не сработает, убедитесь, что ваш шаблон соответствует «характеристикам» в начале.
Спасибо за вашу помощь еще раз. Добавление функции normalize-space добавляет в вывод текст «Информация недоступна». Однако он появляется в любом случае, даже если элементы не пусты (где должен отображаться текст, определенный в XML).
Не могли бы вы также скопировать весь XML? Я думаю, причина в вашем "для каждого". Он составляется для каждого "/музея/экспозиции/подарка/экспозиции". XML-файлы, которые вы разместили ранее, имеют характеристики. Возможно, вам следует добавить новый для каждого или добавить характеристики к вашему текущему для каждого.
Я обновил XML, и теперь доступна полная версия, хотя и не на английском языке из-за размера кода и важности сохранения одинаковых имен элементов. Надеюсь, это поможет.
Отлично, не проблема, я тоже из Бразилии, ха-ха. Я обновил XSL. Ваш путь был неправильным для проверки стиля. Ваш для каждого делается на "exposicao". Чтобы добраться до «estilo», вы можете зайти в «dados_exp/caracteristicas» раньше. Затем вы можете протестировать «estilo». Дайте мне знать, если это работает.
Привет. Спасибо за ваше понимание. Как вы и советовали, я обновил XSLT, чтобы в нем было столько информации, сколько я считаю необходимым. Я извиняюсь, если кода, который я предоставил ранее, было недостаточно, чтобы понять, как был сформулирован мой XSLT.