Изменение пространства имен для файла XML в XSL Translation - PullRequest
10 голосов
/ 12 августа 2010

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

10 голосов
/ 12 августа 2010

Это преобразование :

 <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>
...