Проблема с пространствами имен при динамическом генерировании kml - PullRequest
0 голосов
/ 07 мая 2019

Я использую процесс разработки через тестирование, чтобы создать xslt для динамического создания данных kml. С xslt я использую xspec для управления тестами. И я испытываю проблему пространства имен по умолчанию.

Таблица стилей xsl содержит большое количество объявлений пространства имен

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
    xmlns:gx="http://www.google.com/kml/ext/2.2" 
    xmlns:kml="http://www.opengis.net/kml/2.2" 
    xmlns:atom="http://www.w3.org/2005/Atom"
    exclude-result-prefixes="xs xd kml gx atom"
    version="1.0">

Файл теста xpec имеет более простое объявление

<x:description xmlns:x="http://www.jenitennison.com/xslt/xspec" 

Часть кода xslt копирует наборы элементов стиля kml в выходной поток, например,

<StyleMap id="msn_ylw-pushpin">
    <Pair>
        <key>normal</key>
        <styleUrl>#sn_ylw-pushpin</styleUrl>
    </Pair>
    <Pair>
        <key>highlight</key>
        <styleUrl>#sh_ylw-pushpin</styleUrl>
    </Pair>
</StyleMap>

Это определено в элементе.

В тестовом файле xspec я указываю, какой kml ожидать, и просто копирую и вставляю этот код в соответствующий элемент.

Но тест не пройден, так как генерируемый файл содержит пустое объявление xmlns = "" пространства имен, например

XSPEC file

<x:description xmlns:x="http://www.jenitennison.com/xslt/xspec" stylesheet="KMLLibraryTest.xsl">
    <x:scenario label="just a test">
        <x:call template="make-ghost-namespace"/>
        <x:expect label="Test output">
            <kml xmlns="http://www.opengis.net/kml/2.2" 
                xmlns:gx="http://www.google.com/kml/ext/2.2" 
                xmlns:kml="http://www.opengis.net/kml/2.2" 
                xmlns:atom="http://www.w3.org/2005/Atom">
                <Document>
                    <name>Las Salinetas Port Limits</name>
                    <StyleMap id="msn_ylw-pushpin">
                        <Pair>
                            <key>normal</key>
                            <styleUrl>#sn_ylw-pushpin</styleUrl>
                        </Pair>
                        <Pair>
                            <key>highlight</key>
                            <styleUrl>#sh_ylw-pushpin</styleUrl>
                        </Pair>
                    </StyleMap>
                    <Placemark id="{generate-id()}">
                        <Snippet>&#160;</Snippet>
                        <name>Test</name>
                        <styleUrl>#msn_ylw-pushpin</styleUrl>
                        <LineString>
                            <tessellate>1</tessellate>
                            <coordinates>-25.3633333,46.9916667,0 -25.3566667,46.9383333,0 </coordinates>                                
                        </LineString>
                    </Placemark>
                </Document>
            </kml>
        </x:expect>
    </x:scenario>
</x:description>


XSL file
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
    xmlns:gx="http://www.google.com/kml/ext/2.2" 
    xmlns:kml="http://www.opengis.net/kml/2.2" 
    xmlns:atom="http://www.w3.org/2005/Atom"
    exclude-result-prefixes="xs xd kml gx atom"
    version="1.0">

    <xsl:variable name="test-style">
        <StyleMap id="msn_ylw-pushpin">
            <Pair>
                <key>normal</key>
                <styleUrl>#sn_ylw-pushpin</styleUrl>
            </Pair>
            <Pair>
                <key>highlight</key>
                <styleUrl>#sh_ylw-pushpin</styleUrl>
            </Pair>
        </StyleMap>
    </xsl:variable>

    <xd:doc scope="component">
        <xd:desc>
            <xd:p>Testing the creation of ghost empty namespace declarations</xd:p>
        </xd:desc>
    </xd:doc>
    <xsl:template name="make-ghost-namespace">
        <kml xmlns="http://www.opengis.net/kml/2.2" 
            xmlns:gx="http://www.google.com/kml/ext/2.2" 
            xmlns:kml="http://www.opengis.net/kml/2.2" 
            xmlns:atom="http://www.w3.org/2005/Atom">
            <Document>
                <name>Las Salinetas Port Limits</name>
                <xsl:copy-of select="$test-style"/>
                <Placemark id="{generate-id()}">
                    <Snippet>&#160;</Snippet>
                    <name>Test</name>
                    <styleUrl>#msn_ylw-pushpin</styleUrl>
                    <LineString>
                        <tessellate>1</tessellate>
                        <coordinates>-25.3633333,46.9916667,0 -25.3566667,46.9383333,0 </coordinates>                                
                    </LineString>
                </Placemark>
            </Document>
        </kml>
    </xsl:template>


</xsl:stylesheet>

Один тест не пройден, так как фактический результат равен


    <kml xmlns="http://www.opengis.net/kml/2.2">
       <Document>
          <name>Las Salinetas Port Limits</name>
          <StyleMap xmlns="" id="msn_ylw-pushpin">
             <Pair>
                <key>normal</key>
                <styleUrl>#sn_ylw-pushpin</styleUrl>
             </Pair>
             <Pair>
                <key>highlight</key>
                <styleUrl>#sh_ylw-pushpin</styleUrl>
             </Pair>
          </StyleMap>
          <Placemark id="d5">
             <Snippet>&nbsp;</Snippet>
             <name>Test</name>
             <styleUrl>#msn_ylw-pushpin</styleUrl>
             <LineString>
                <tessellate>1</tessellate>
                <coordinates>-25.3633333,46.9916667,0 -25.3566667,46.9383333,0 </coordinates>
             </LineString>
          </Placemark>
       </Document>
    </kml>

Итак, что мне нужно сделать, чтобы избежать создания этих пространств имен по умолчанию во время тестирования?

РАСШИРЕНИЕ: Таким образом, первый ответ работает, но если я добавлю еще один шаблон в таблицу

<xsl:template name="make-network-link">
    <xsl:param name="name"/>
    <xsl:param name="uri"/>
    <xsl:param name="vis" select="0"/>
    <xsl:param name="open" select="0"/>
    <xsl:param name="refresh"/>
    <NetworkLink>
        <name><xsl:value-of select="$name"/></name>
        <visibility><xsl:value-of select="$vis"/></visibility>
        <open><xsl:value-of select="$open"/></open>
        <xsl:if test="$refresh">
            <refreshVisibility><xsl:value-of select="$refresh"/></refreshVisibility>
        </xsl:if>
        <Link>
            <href><xsl:value-of select="$uri"/></href>
        </Link>
    </NetworkLink>
</xsl:template>

и измените объявление так, чтобы оно включало пространство имен по умолчанию, а также подавили #default следующим образом

<xsl:stylesheet xmlns="http://www.opengis.net/kml/2.2"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
    xmlns:gx="http://www.google.com/kml/ext/2.2" 
    xmlns:kml="http://www.opengis.net/kml/2.2" 
    xmlns:atom="http://www.w3.org/2005/Atom"
    exclude-result-prefixes="#default xs xd kml gx atom"
    version="1.0">

и добавьте еще один тест в файл xspec

<x:scenario label="Create test Network link">
    <x:call template="make-network-link">
        <x:param name="name" select="'Test network link etc'"/>
        <x:param name="uri" select="'http://kmlbalahblah.com/GE/TZFolder.kml'"/>
        <x:param name="vis" select="'1'"/>
    </x:call>
    <x:expect label="Default Hardcoded links">
        <NetworkLink>
            <name>Test network link etc</name>
            <visibility>1</visibility>
            <open>0</open>
            <Link>
                <href>http://kmlbalahblah.com/GE/TZFolder.kml</href>
            </Link>
        </NetworkLink>
    </x:expect>
</x:scenario>

Полученный вывод по-прежнему поступает с пространством имен по умолчанию, т.е.

<NetworkLink xmlns="http://www.opengis.net/kml/2.2">
   <name>Test network link etc</name>
   <visibility>1</visibility>
   <open>0</open>
   <Link>
      <href>http://kmlbalahblah.com/GE/TZFolder.kml</href>
   </Link>
</NetworkLink>

Как мне теперь запретить ЭТО пространство имен?

...