Итак, у меня есть входной файл, который использует пространство имен моей компании в пространстве имен по умолчанию ( 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 на моем опыте.
Это преобразование :
<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>