Ошибка xslt, если xml имеет дополнительный тег xml - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть следующее XML

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <GetDetailsResponse xmlns="http://www.test.org.za/testservice/">
            <GetDetailsResult>
                <?xml version="1.0" encoding="utf-16"?>
                <Name>Paul</Name>
                <LastName>Smith</LastName>          
            </GetDetailsResult>
        </GetDetailsResponse>
    </soap:Body>
</soap:Envelope>

У меня есть XSLT, который пытается получить теги Name и LastName из XML

Но это не удается из-за дополнительный <?xml version="1.0" encoding="utf-16"?> тег.

Есть ли способ обойти это

Ответы [ 2 ]

2 голосов
/ 03 апреля 2020

Ваш входной файл не правильно сформирован XML, поэтому невозможно обработать его с помощью XSLT (или любого другого инструмента, предназначенного для обработки XML).

Вам необходимо исправить проблема в источнике: выясните, где создаются данные, и исправьте этот процесс, чтобы он генерировал правильно сформированные XML.

0 голосов
/ 03 апреля 2020

Lib XML имеет возможность восстановить испорченные XML файлы. Это позволяет удалить узел PI. Но это не исправит вашу проблему с кодировкой, и я сомневаюсь, что любой инструмент сможет это исправить. Возможно, вам придется написать парсер XML с нуля.

#!/usr/bin/perl
use warnings;
use strict;
use XML::LibXML;
use XML::LibXML::Iterator;
use Data::Dumper;

my $parser = XML::LibXML->new;
$parser->recover(1);
my $xml = $parser->load_xml(IO => \*DATA);
my $iter= XML::LibXML::Iterator->new($xml->documentElement);
while ($iter->nextNode) {
  my $node = $iter->current();
  if (ref $node eq 'XML::LibXML::PI') {
    $node->parentNode->removeChild($node);
  }
}
print $xml->toString();

__DATA__
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <GetDetailsResponse xmlns="http://www.test.org.za/testservice/">
            <GetDetailsResult>
                <?xml version="1.0" encoding="utf-16"?>
                <Name>Paul</Name>
                <LastName>Smith</LastName>
            </GetDetailsResult>
        </GetDetailsResponse>
    </soap:Body>
</soap:Envelope>
...