Я хочу следующий вывод XML-файла:
<?xml version="1.0" encoding="ISO-8859-1" ?> - <T0020 xsi:schemaLocation="http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.safersys.org/namespaces/T0020V1"> - <INTERFACE> <NAME>SAFER</NAME> <VERSION>04.02</VERSION> </INTERFACE>
для этого у меня есть следующий файл xslt:
<xsl:template match="T0020" > <xsl:copy> <xsl:attribute name="xsi:schemaLocation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd </xsl:attribute> //some code here...............// <xsl:copy>
поэтому я добавляю атрибут xmlns = "http://www.safersys.org/namespaces/T0020V1" в тег <T0020> ??
<T0020>
Это преобразование :
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:variable name="vDefaultNS" select="'http://www.safersys.org/namespaces/T0020V1'"/> <xsl:template match="*"> <xsl:element name="{name()}" namespace="{$vDefaultNS}"> <xsl:copy-of select="namespace::* | @*"/> <xsl:apply-templates/> </xsl:element> </xsl:template> </xsl:stylesheet>
при применении к этому документу XML :
<T0020 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd" > <INTERFACE> <NAME>SAFER</NAME> <VERSION>04.02</VERSION> </INTERFACE> </T0020>
дает желаемый результат :
<T0020 xmlns="http://www.safersys.org/namespaces/T0020V1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd"> <INTERFACE> <NAME>SAFER</NAME> <VERSION>04.02</VERSION> </INTERFACE> </T0020>
Обратите внимание , что xmlns не является атрибутом, но обозначает объявление пространства имен.
xmlns
Эта таблица стилей:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="*"> <xsl:element name="{name()}" namespace="http://www.safersys.org/namespaces/T0020V1"> <xsl:apply-templates select="@*|node()"/> </xsl:element> </xsl:template> <xsl:template match="T0020"> <xsl:element name="{name()}" namespace="http://www.safersys.org/namespaces/T0020V1"> <xsl:attribute name="xsi:schemaLocation">http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd</xsl:attribute> <xsl:apply-templates select="@*|node()"/> </xsl:element> </xsl:template> </xsl:stylesheet>
С этим входом:
<T0020> <INTERFACE> <NAME>SAFER</NAME> <VERSION>04.02</VERSION> </INTERFACE> </T0020>
Выход:
<T0020 xsi:schemaLocation="http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.safersys.org/namespaces/T0020V1"> <INTERFACE> <NAME>SAFER</NAME> <VERSION>04.02</VERSION> </INTERFACE> </T0020>
Примечание : узлом пространства имен являютсяне атрибуты узлов.Если вы хотите, чтобы элементы без пространства имен выводились в некотором пространстве имен, вам нужен xsl:element/@namespace.
xsl:element/@namespace