Я использую XSLT 1.0 для преобразования некоторого XML.Выход пространства имен с XSLT 1.0, вызывающий проблемы
Я не совсем уверен, что лучший способ объяснить это, поэтому будет использовать некоторые примеры.
Мой ввод XML содержит специализацию с использованием объявления типа xsi: type. См узел Payload:
<ns0:RootNode xmlns:ns0="namespace1" xmlns:ns1="namespace2" xmlns:xsi="http://www.w3.org/2001/XMLSchema">
<ns0:Payload xsi:type="ns1:SpecialPayload">
<ns1:InnerNode>Hello</ns1:InnerNode>
</ns0:Payload>
</ns0:RootNode>
Когда я посылаю это через мой XSLT (предположим, 1 к 1 экземпляр), я получаю следующий вывод
<ns0:RootNode xmlns:ns0="namespace1" xmlns:xsi="http://www.w3.org/2001/XMLSchema">
<ns0:Payload xsi:type="ns1:SpecialPayload">
<ns1:InnerNode xmlns:ns1="namespace2">Hello</ns1:InnerNode>
</ns0:Payload>
</ns0:RootNode>
Обратите внимание на пространство имен ns1 было присоединено к отдельных узлов в узле полезной нагрузки. В большинстве случаев это было бы хорошо, однако мне нужно, чтобы это объявление выполнялось раньше, то есть на корневом узле, поскольку оно делает определение типа xsi: type на узле полезной нагрузки недействительным, поскольку в этот момент сериализатор не знает о пространстве имен ns1 , что препятствует правильному анализу вниз по течению.
Что я могу сделать, чтобы заставить это пространство имен выводиться немного раньше?
Отредактирован XSLT-код:
<!-- Replace The ESBMessage node with the SOAP method -->
<xsl:template match="s1:ESBMessage" mode="copy">
<s0:SendESBMessage>
<s0:msg>
<xsl:apply-templates select="*" mode="copy"/>
</s0:msg>
</s0:SendESBMessage>
</xsl:template>
<!-- Generic Copy -->
<xsl:template match="*" mode="copy">
<xsl:element name="{name(.)}" namespace="{namespace-uri(.)}">
<xsl:copy-of select="@*"/>
<xsl:apply-templates mode="copy"/>
</xsl:element>
</xsl:template>
Как вы можете видеть из моего ответа, на ваш вопрос отсутствует важная и необходимая информация. Пожалуйста, предоставьте минимальный пример кода, демонстрирующий проблему. –
Привет, Dimitre, я добавил пример кода в соответствии с запросом. Я просто просматриваю ваш код, чтобы узнать, нет ли там чего-то. Спасибо! – themistry
Ваше правило не является правилом идентификации вообще. Вы говорите: * При сопоставлении элемента в режиме 'copy', создайте элемент с тем же QName и тем же URI пространства имен. Добавьте в качестве содержимого копию дочерних элементов атрибута и примените шаблоны к дочерним элементам узла в режиме «copy». * Таким образом, в основном ваши дескрипторы в пространствах имен в области, что не происходит при использовании команды 'xsl: copy'. – 2010-10-12 12:25:45