Удалить все теги из нежелательных пространств имен - PullRequest
0 голосов
/ 17 ноября 2018

Я хочу проанализировать файлы XML у пользователей.Они могут содержать теги из определенного списка XML-NS-URL.

Но у некоторых есть «расширения» из пространств имен, которых нет в нашем списке - так что наш jaxb-parser падает.

Существует ли какой-либо XSL, который удаляет все пространства имен и их теги, которых нет набелый список?

1 Ответ

0 голосов
/ 17 ноября 2018

Рассмотрим следующий пример:

XML

<root xmlns="http://www.example.com/a">
    <item xmlns="http://www.example.com/b">
        <sub-item>bravo</sub-item>
    </item>
    <item xmlns="http://www.example.com/x">
        <sub-item>x-ray</sub-item>
    </item>
    <item xmlns="http://www.example.com/c">
        <sub-item>charlie</sub-item>
    </item>
</root>

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="http://www.example.com/my"
exclude-result-prefixes="my">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<my:allowed-namespaces>
    <uri>http://www.example.com/a</uri>
    <uri>http://www.example.com/b</uri>
    <uri>http://www.example.com/c</uri>
</my:allowed-namespaces>

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

<xsl:template match="*[not(namespace-uri()=document('')/xsl:stylesheet/my:allowed-namespaces/uri)]"/>

</xsl:stylesheet>

Результат

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="http://www.example.com/a">
  <item xmlns="http://www.example.com/b">
    <sub-item>bravo</sub-item>
  </item>
  <item xmlns="http://www.example.com/c">
    <sub-item>charlie</sub-item>
  </item>
</root>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...