Вы на полпути к правильному ответу.Когда вы объявляете пространство имен по умолчанию в корне преобразования, вы утверждаете (при условии, что вы не переопределяете объявление в другом месте), что все неквалифицированные элементы в этом документе принадлежат этому пространству имен.Каждый неквалифицированный элемент, который излучает преобразование, будет принадлежать этому пространству имен.Вы правильно поняли эту часть.
Я думаю, что вы, вероятно, упускаете из виду то, что объявления пространства имен в XSLT-преобразовании также применяются к шаблонам XPath в преобразовании.Держу пари, что тесты узлов XPath в вашем преобразовании не соответствуют ни одному из входных узлов, потому что входные узлы находятся в пустом пространстве имен, а не в пространстве имен, которое вы объявили в преобразовании.
Что вывероятно, нужно сделать что-то вроде этого:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:s="http://www.mycompany.com/schema"
xnlns:no=""
xmlns="http://www.mycompany.com/def_schema">
... и затем изменить шаблоны в преобразовании соответственно:
<xsl:template match="no:foo">
<foo>...</foo>
</xsl:template>
Это, кстати, один изПричины существования xsl:element
- вы можете создать шаблон, который преобразует элементы из одного пространства имен в другое, например:
<xsl:template match="no:*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:element>
Редактировать:
У меня естьДо этого не играл с пространством имен таким образом, и оказалось, что вышеупомянутое на самом деле не является законным.Вы не можете указать пространство имен с префиксом пространства имен.Таким образом, вы не можете использовать целевое пространство имен в качестве пространства имен по умолчанию для вашего преобразования, потому что тогда у вас нет возможности указать XPath найти элементы в исходном документе.
Вы можете указать выходное пространство имен с помощьюпрефикс, например:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:s="http://www.mycompany.com/schema"
xmlns:out="http://www.mycompany.com/def_schema">
... но при этом в выходной файл будет записан префикс пространства имен out
, что не будет мешать любому процессору XML, но может беспокоить людей.Или вы можете указать это явно в ваших шаблонах, например:
<xsl:template match="foo">
<xsl:element name="foo" namespace="http://www.mycompany.com/def_schema">
...
</xsl:element>
</xsl:template>