Изменение пространства имен для файла XML в XSL Translation
Итак, у меня есть входной файл, который использует пространство имен моей компании в пространстве имен по умолчанию (xmlns="companyURL"
) но я хочу, чтобы мой выходной файл использовал что-то отличное от пространства имен по умолчанию (xmlns:cmp="companyURL"
). Поэтому я создаю свой файл, используя cmp
пространство имен, но затем я хочу скопировать некоторые из внутренних элементов:
<xsl:element name="cmp:container">
<xsl:for-each select="foo">
<xsl:copy-of select="." />
</xsl:for-each>
</xsl:element>
К сожалению, для этого определяется пространство имен по умолчанию для каждого из этих внутренних элементов, что делает файл невероятно многословным и уродливым. Упрощенный пример:
Источник:
<foo xmlns="companyURL">
<num1>asdf</num1>
<num2>ghjkl</num2>
</foo>
Превращается в:
<cmp:container xmlns:cmp="companyURL">
<num1 xmlns="companyURL">asdf</num1>
<num2 xmlns="companyURL">ghjkl</num2>
</cmp:container>
Конечно, companyURL
он большой, длинный и некрасивый, и одинаковый в обоих местах, поэтому я бы предпочел, чтобы приведенный выше результат был следующим:
<cmp:container xmlns:cmp="companyURL">
<cmp:num1>asdf</cmp:num1>
<cmp:num2>ghjkl</cmp:num2>
</cmp:container>
Есть ли простой способ сделать это, или я должен конвертировать все под cmp
пространство имен в пространство имен по умолчанию? Я бы предпочел использовать явное именование пространства имен, если это возможно, это помогает понять XSLT в моем опыте.
1 ответ
Это преобразование:
<xsl:template match="*">
<xsl:element name="cmp:{name()}" namespace="CompanyURL">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="/*">
<cmp:container xmlns:cmp="CompanyURL">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</cmp:container>
</xsl:template>
</xsl:stylesheet>
когда выполняется на предоставленном XML-документе:
<foo xmlns="companyURL">
<num1>asdf</num1>
<num2>ghjkl</num2>
</foo>
дает желаемый, правильный результат:
<cmp:container xmlns:cmp="CompanyURL">
<cmp:num1>asdf</cmp:num1>
<cmp:num2>ghjkl</cmp:num2>
</cmp:container>