Изменение пространства имен для XML-файла в XSL-трансляции

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

10
задан adam_0 12 August 2010 в 16:28
поделиться

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>
10
ответ дан 4 December 2019 в 01:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: