Обход пространств имен при копировании XML с помощью XSLT - PullRequest
4 голосов
/ 11 июня 2009

Начиная с XML с пространством имен по умолчанию:

<Root>
  <A>foo</A>
  <B></B>
  <C>bar</C>
</Root>

Я применяю XSLT для удаления элемента 'C':

<?xml version="1.0" ?>

<xsl:stylesheet version="2.0" xmlns="http://www.w3.org/1999/XSL/Transform" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="html" indent="no" encoding="utf-8" />

<xsl:template match="*">
        <xsl:copy>
                <xsl:copy-of select="@*" />
                <xsl:apply-templates />
        </xsl:copy>
</xsl:template>

<xsl:template match="C" />

</xsl:stylesheet>

и я получаю следующий XML (нормально, если «B» не свернут, потому что я использую HTML как метод вывода):

<Root>
  <A>foo</A>
  <B></B>
</Root>

Но тогда, если я когда-нибудь получу другой XML, на этот раз с пространством имен:

<Root xmlns="http://company.com">
  <A>foo</A>
  <B></B>
  <C>bar</C>
</Root>

элемент 'C' не удаляется после процесса XSLT.

Что я могу сделать, чтобы обойти это пространство имен, есть ли способ?

1 Ответ

9 голосов
/ 11 июня 2009

Не очень рекомендуется, но работает:

<xsl:template match="*[local-name()='C']" />

Лучше:

<xsl:stylesheet 
  version="2.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:foo="http://company.com"
  exclude-result-prefixes="foo"
>

  <!-- ... -->

  <xsl:template match="C | foo:C" />

  <!-- ... -->

</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...