XSL-преобразование не может быть найдено в течение каждого - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь создать лист преобразования 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>

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

Спасибо!

1 Ответ

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

Разница проста - исходный xml имеет объявление пространства имен по умолчанию xmlns="http://www.isotc211.org/2005/gmx", и поэтому ваш цикл ничего не найдет, если только вы не используете это пространство имен.

Используйте его, например. как xmlns:gmx="http://www.isotc211.org/2005/gmx" в корне xsl, а затем использовать его как <xsl:for-each select="gmx:CT_CodelistCat...

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