удалить плохие атрибуты из xml через xslt - PullRequest
0 голосов
/ 07 октября 2018

У меня есть какой-то xml, и я пытаюсь удалить плохие атрибуты, которые добавляются некоторыми другими xslt.

<?xml version="1.0" encoding="UTF-8"?><MYXML xmlns="http://someURL/MYXML" xmlns:role="http://someURL/role">
    <firstElement>
        <LANGUAGE>Spanish</LANGUAGE>
        <VOCABULARY>Spain</VOCABULARY>
    </firstElement>
    <External xmlns="" xmlns:myxml="http://someURL/MYXML">
        <EXTARData/>
        <AnotherElementData>
            <AnotherElement xmlns="http://someURL/AnotherElement"/>
        </AnotherElementData>
    </External>
</MYXML><!--checksum=A477829F524D170104E87187AD2869F5443DD079196B0EDCD5C6B9CFDD315232 version=1-->

Я бы хотел удалить xmlns = "xmlns: myxml =" http://someURL/MYXML"" без успеха.

Мои ожидаемые результаты:

<?xml version="1.0" encoding="UTF-8"?><MYXML xmlns="http://someURL/MYXML" xmlns:role="http://someURL/role">
    <firstElement>
        <LANGUAGE>Spanish</LANGUAGE>
        <VOCABULARY>Spain</VOCABULARY>
    </firstElement>
    <External >
        <EXTARData/>
        <AnotherElementData>
            <AnotherElement xmlns="http://someURL/AnotherElement"/>
        </AnotherElementData>
    </External>
</MYXML><!--checksum=A477829F524D170104E87187AD2869F5443DD079196B0EDCD5C6B9CFDD315232 version=1-->

Может ли кто-нибудь помочь мне с этим?

1 Ответ

0 голосов
/ 07 октября 2018

Таким образом, вы, кажется, хотите преобразовать элементы без пространства имен в пространство имен корневого элемента:

  <xsl:template match="*[namespace-uri() = '']">
      <xsl:element name="{local-name()}" namespace="{namespace-uri(/*)}">
          <xsl:apply-templates select="@* | node()"/>
      </xsl:element>
  </xsl:template>

, что вместе с преобразованием идентичности дает

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

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="*[namespace-uri() = '']">
      <xsl:element name="{local-name()}" namespace="{namespace-uri(/*)}">
          <xsl:apply-templates select="@* | node()"/>
      </xsl:element>
  </xsl:template>

</xsl:stylesheet>

и результатыв https://xsltfiddle.liberty -development.net / eiZQaFX

<MYXML xmlns="http://someURL/MYXML" xmlns:role="http://someURL/role">
    <firstElement>
        <LANGUAGE>Spanish</LANGUAGE>
        <VOCABULARY>Spain</VOCABULARY>
    </firstElement>
    <External>
        <EXTARData />
        <AnotherElementData>
            <AnotherElement xmlns="http://someURL/AnotherElement" xmlns:myxml="http://someURL/MYXML" />
        </AnotherElementData>
    </External>
</MYXML><!--checksum=A477829F524D170104E87187AD2869F5443DD079196B0EDCD5C6B9CFDD315232 version=1-->

Как видите, это не совсем тот результат, который вы показали, поскольку преобразование идентичности в XSLT 1 копирует пространство имен xmlns:myxml="http://someURL/MYXML" это было в поле зрения AnotherElement.

Эту проблему можно легко избежать с помощью процессора XSLT 2 или 3, используя

см. https://xsltfiddle.liberty -development.net / eiZQaFX / 1 .

С процессором XSLT 1 вам потребуется больше усилий, чтобы убедиться, что элементы копируются без каких-либо пространств имен:

  <xsl:template match="*[namespace-uri() = '']//*[namespace-uri() != '']">
      <xsl:element name="{name()}" namespace="{namespace-uri()}">
          <xsl:apply-templates select="@* | node()"/>
      </xsl:element>
  </xsl:template>

CompleteНапример,

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

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="*[namespace-uri() = '']">
      <xsl:element name="{local-name()}" namespace="{namespace-uri(/*)}">
          <xsl:apply-templates select="@* | node()"/>
      </xsl:element>
  </xsl:template>

  <xsl:template match="*[namespace-uri() = '']//*[namespace-uri() != '']">
      <xsl:element name="{name()}" namespace="{namespace-uri()}">
          <xsl:apply-templates select="@* | node()"/>
      </xsl:element>
  </xsl:template>

</xsl:stylesheet>

в https://xsltfiddle.liberty -development.net / eiZQaFX / 2

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