Я использую процесс разработки через тестирование, чтобы создать 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> </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> </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> </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>
Как мне теперь запретить ЭТО пространство имен?