Я пытаюсь создать лист преобразования XSL для набора XML из списков кодов ISO 19115, чтобы я мог отформатировать их для отдельного документа. Однако до сих пор мой XSL ничего не генерирует после того, как он пытается «зациклить», используя первый for-each. Мне, однако, удалось заставить работать аналогичный «тестовый» документ.
Короткая версия XML-файла, который я пытаюсь проанализировать:
<?xml version="1.0" encoding="UTF-8"?>
<CT_CodelistCatalogue xmlns="http://www.isotc211.org/2005/gmx" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.isotc211.org/2005/gmx ../../gmx/gmx.xsd http://www.isotc211.org/2005/gco ../../gco/gco.xsd http://www.opengis.net/gml ../../gml/gml.xsd http://www.w3.org/1999/xlink ../../xlink/xlinks.xsd">
<codelistItem>
<CodeListDictionary gml:id="CI_DateTypeCode">
<gml:description>identification of when a given event occurred</gml:description>
<gml:identifier codeSpace="ISOTC211/19115">CI_DateTypeCode</gml:identifier>
<codeEntry>
<CodeDefinition gml:id="CI_DateTypeCode_creation">
<gml:description>date identifies when the resource was brought into existence</gml:description>
<gml:identifier codeSpace="ISOTC211/19115">creation</gml:identifier>
</CodeDefinition>
</codeEntry>
<codeEntry>
<CodeDefinition gml:id="CI_DateTypeCode_publication">
<gml:description>date identifies when the resource was issued</gml:description>
<gml:identifier codeSpace="ISOTC211/19115">publication</gml:identifier>
</CodeDefinition>
</codeEntry>
<codeEntry>
<CodeDefinition gml:id="CI_DateTypeCode_revision">
<gml:description>date identifies when the resource was examined or re-examined and improved or amended</gml:description>
<gml:identifier codeSpace="ISOTC211/19115">revision</gml:identifier>
</CodeDefinition>
</codeEntry>
</CodeListDictionary>
</codelistItem>
</CT_CodelistCatalogue>
XSL, с которым я работаю, выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.isotc211.org/2005/gmx" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.isotc211.org/2005/gmx ../../gmx/gmx.xsd http://www.isotc211.org/2005/gco ../../gco/gco.xsd http://www.opengis.net/gml ../../gml/gml.xsd http://www.w3.org/1999/xlink ../../xlink/xlinks.xsd">
<xsl:output method="html"/>
<xsl:template match="/">
<html>
<head>
<title>Codelists</title>
</head>
<body>
The first table should be below this.
<xsl:for-each select="CT_CodelistCatalogue/codelistItem/CodeListDictionary">
We have found an item and are creating a list of elements. NB: It never gets to this line
<table>
<xsl:for-each select="codeEntry/CodeDefinition">
<tr>
<td><xsl:value-of select="gml:identifier"/></td>
<td><xsl:value-of select="gml:description"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Этот XSL генерирует следующий вывод HTML. Обратите внимание, что нет даже вызова «таблицы», поэтому создается впечатление, что for-each не удается найти соответствующий элемент.
<html xmlns="http://www.isotc211.org/2005/gmx"
xmlns:gco="http://www.isotc211.org/2005/gco"
xmlns:gml="http://www.opengis.net/gml/3.2"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<head>
<title>Codelists</title>
</head>
<body>
The first table should be below this.
</body>
</html>
Чтобы попытаться решить мою проблему, я бездельничал в демонстрационной среде w3schools и создал аналогично структурированный XML - просто с разными именами элементов и без атрибутов.
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<title>My catalog</title>
<disc>
<cd>
<title>Empire Burlesque</title>
<firstname>blank</firstname>
<lastname>dude</lastname>
<performer>
<artist>
<firstname>Bob</firstname>
<lastname>Dylan</lastname>
</artist>
</performer>
<performer>
<artist>
<firstname>Job</firstname>
<lastname>Bylan</lastname>
</artist>
</performer>
</cd>
</disc>
<disc>
<cd>
<title>Hide your heart</title>
<firstname>test</firstname>
<lastname>case</lastname>
<performer>
<artist>
<firstname>Bonnie</firstname>
<lastname>Tyler</lastname>
</artist>
</performer>
</cd>
</disc>
</catalog>
и XSL, который правильно генерирует вывод.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<xsl:for-each select="catalog/disc/cd">
<h3><xsl:value-of select="title" /></h3>
<table border="1">
<xsl:for-each select="performer/artist">
<tr>
<td><xsl:value-of select="firstname" /></td>
<td><xsl:value-of select="lastname" /></td>
</tr>
</xsl:for-each>
</table>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Приведенные выше XML и XSL генерируют мой ожидаемый табличный вывод.
<body>
<h2>My CD Collection</h2>
<h3>Empire Burlesque</h3>
<table border="1">
<tbody>
<tr>
<td>Bob</td><td>Dylan</td>
</tr>
<tr>
<td>Job</td><td>Bylan</td>
</tr>
</tbody>
</table>
<h3>Hide your heart</h3>
<table border="1">
<tbody>
<tr>
<td>Bonnie</td><td>Tyler</td>
</tr>
</tbody>
</table>
</body>
Я действительно надеюсь, что это какая-то простая ошибка, которую я совершаю, но я застрял на некоторое время и, возможно, мог бы использовать какой-то внешний совет.
Спасибо!