Мне нужна помощь в создании сопоставления XSLT для удаления всех префиксов ns (NS0, NS1 и т. д.) И включения нового префикса во все теги.
Ниже представлен ввод и вывод XML для примера.
Вход
<ns0:ExecuteMultipleOperations xmlns:ns0 = "http://www.example.com">
<ns0:Operations>
<ns0:Operation>
<ns0:Action>Create</ns0:Action>
<ns0:Object>
<ns1:SOUser xmlns:ns1 = "http://www.example.com">
<ns1:FullName>My Full Name</ns1:FullName>
<ns1:EmailAddress>[email protected]</ns1:EmailAddress>
<ns1:Active>1</ns1:Active>
</ns1:SOUser>
</ns0:Object>
</ns0:Operation>
</ns0:Operations>
<ns0:OneTransaction>true</ns0:OneTransaction>
<ns0:ContinueOnError>true</ns0:ContinueOnError>
</ns0:ExecuteMultipleOperations>
Выход
<clic:ExecuteMultipleOperations xmlns:clic = "http://www.example.com">
<clic:Operations>
<clic:Operation>
<clic:Action>Create</clic:Action>
<clic:Object>
<clic:SOUser>
<clic:FullName>My Full Name</clic:FullName>
<clic:EmailAddress>[email protected]</clic:EmailAddress>
<clic:Active>1</clic:Active>
</clic:SOUser>
</clic:Object>
</clic:Operation>
</clic:Operations>
<clic:OneTransaction>true</clic:OneTransaction>
<clic:ContinueOnError>true</clic:ContinueOnError>
</clic:ExecuteMultipleOperations>
Есть предложения?
Пожалуйста, попробуйте приведенный ниже XSLT, который соответствует всем элементам с префиксом ns0
и ns1
и заменяет их имена префиксом clic
.
<xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
xmlns:clic = "http://www.example.com"
xmlns:ns0 = "http://www.example.com"
xmlns:ns1 = "http://www.example.com">
<xsl:output method = "xml" />
<xsl:strip-space elements = "*" />
<xsl:template match = "ns0:* | ns1:*">
<xsl:element name = "clic:{local-name()}">
<xsl:apply-templates select = "@* | node()" />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Выход
<clic:ExecuteMultipleOperations xmlns:clic = "http://www.example.com">
<clic:Operations>
<clic:Operation>
<clic:Action>Create</clic:Action>
<clic:Object>
<clic:SOUser>
<clic:FullName>My Full Name</clic:FullName>
<clic:EmailAddress>[email protected]</clic:EmailAddress>
<clic:Active>1</clic:Active>
</clic:SOUser>
</clic:Object>
</clic:Operation>
</clic:Operations>
<clic:OneTransaction>true</clic:OneTransaction>
<clic:ContinueOnError>true</clic:ContinueOnError>
</clic:ExecuteMultipleOperations>
Обратите внимание, что XSLT 1.0 не гарантирует, что в выводе этой таблицы стилей будет использоваться префикс «clic», хотя вполне вероятно, что многие процессоры XSLT 1.0 дадут желаемый результат. XSLT 2.0 действительно гарантирует использование префикса «clic».
** Внимание: ** подумайте, почему вы заботитесь о префиксе пространства имен. Если это потому, что вы просто хотите, чтобы он выглядел согласованно, это нормально, но если это потому, что что-то ломается и не работает, если не используется префикс
clic
, это запах. Вполне вероятно, что они выполняют какой-то хакерский синтаксический анализ строк, а не используют инструменты XML и API-интерфейсы, которые идентифицируют элементы, относящиеся к пространству имен, к которому они привязаны.