2016-12-05 5 views
0

Мне было поручено обработать несколько RSS-каналов, которые плохо управляются сторонними лицами.Имена и атрибуты тегов RSS-каналов в нижнем регистре с пространствами имен XSLT-хранения

Мой вопрос их капитализация очень ненадежен - например, некоторые каналы они используют правильные теги элементов <rss>, <item> и <enclosure url="example.mp3"> и т.д., но в других случаях они используют неправильный <RSS>, <Item> и <Enclosure URL="example.mp3"> случай.

Излишне говорить, что это делает чтение XML (с PHP5 DOMDocument) очень сложным.

Я нашел довольно хороший таблицы стилей XSLT здесь (по явно очень талантливого michael.hor257k), который может успешно исправить мою проблему капитализации: «How to convert tags in all tags in xml to lowercase without changing case of atribute values?»

ОДНАКО, что таблицы стилей XSLT, в то время как он работает в нижний регистр все элементы и атрибуты .... он удаляет все атрибуты пространства имен корневого уровня RSS!

Например, ниже RSS XML:

<?xml version="1.0" encoding="UTF-8"?> 
<RSS xmlns:atom="http://www.w3.org/2005/Atom" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0"  EXAMPLEATTRIBUTE="example"> 
<channel> 
... 

При запуске с помощью этого XSLT

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

<xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" /> 
<xsl:variable name="lowercase" select="'abcdefghijklmnopqrstuvwxyz'" /> 

<xsl:template match="*"> 
    <xsl:element name="{translate(local-name(), $uppercase, $lowercase)}" namespace="{namespace-uri()}"> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="@*"> 
    <xsl:attribute name="{translate(local-name(), $uppercase, $lowercase)}" namespace="{namespace-uri()}"> 
     <xsl:value-of select="."/> 
    </xsl:attribute> 
</xsl:template> 

<xsl:template match="comment() | text() | processing-instruction()"> 
    <xsl:copy/> 
</xsl:template> 

</xsl:stylesheet> 

Даст следующие результаты

<?xml version="1.0" encoding="UTF-8"?> 
<rss version="2.0" exampleattribute="example"> 
<channel> 
... 

Когда то, что мне действительно нужно

<?xml version="1.0" encoding="UTF-8"?> 
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0"  exampleattribute ="example"> 
<channel> 
... 

Я ценю, что это очень нишевая проблема, но она уже много лет набрасывается на меня, практически, весь мой день.

TL/DR: Есть ли кто-нибудь, пожалуйста, знать, как ...

а) Строчные все атрибуты и теги элементов внутри RSS XML с помощью XSLT 1.0

б) сохранить все RSS корень Пространства имен уровня, делая это (так что «атом» и пространство имен «Itunes» остается)

Я бы невероятно признателен, спасибо очень любезно,

---- Редактировать: Дополнительные примечания, по просьбе майкла.hor257k в комментариях ----

ввода (обратите внимание на заглавной <RSS></RSS>)

<?xml version="1.0" encoding="UTF-8"?><RSS xmlns:atom="http://www.w3.org/2005/Atom" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0"> 
    <CHANNEL> 
    <atom:link href="http://feeds.soundcloud.com/users/soundcloud:users:245142600/sounds.rss" rel="self" type="application/rss+xml"/> 
    <atom:link href="http://feeds.soundcloud.com/users/soundcloud:users:245142600/sounds.rss?before=291065752" rel="next" type="application/rss+xml"/> 
    <title>FASNASTIC: The Everything FASNASTIC Feed</title> 
    <link>http://fasnastic.com</link> 
    <pubDate>Thu, 03 Nov 2016 17:21:11 +0000</pubDate> 
    <lastBuildDate>Thu, 03 Nov 2016 17:21:11 +0000</lastBuildDate> 
    <ttl>60</ttl> 
    <language>en</language> 
    <copyright>All rights reserved</copyright> 
    <webMaster>[email protected] (SoundCloud Feeds)</webMaster> 
    <description>FASNASTIC LTD. is a UK things brand who make games and podcasts and things. 

Schedule.... 

THURSDAY: Game Fart Podcast - The FASNASTIC Farts &amp; Video Games Podcast. 
Farting out video game news for your pleasure. Please do not listen to this podcast if you treat video games even remotely seriously... 

FRIDAY: The Creepy Midnight Podcast - Do you like creepy shit? We do. This FASNASTIC LTD. podcast is designed to be listened to alone, at midnight. Conspiracy theories, science, diseases, technology and aliens. 

Download our apps and games on Android &amp; iOS. 
Find out more at http://fasnastic.com/</description> 
    <itunes:subtitle>FASNASTIC LTD. is a UK things brand who make game…</itunes:subtitle> 
    <itunes:owner> 
     <itunes:name>FASNASTIC</itunes:name> 
     <itunes:email>[email protected]</itunes:email> 
    </itunes:owner> 
    <itunes:author>FASNASTIC LTD.</itunes:author> 
    <itunes:explicit>yes</itunes:explicit> 
    <itunes:image href="http://i1.sndcdn.com/avatars-000274631751-z80y47-original.jpg"/> 
    <IMAGE> 
     <url>http://i1.sndcdn.com/avatars-000274631751-z80y47-original.jpg</url> 
     <title>FASNASTIC</title> 
     <link>http://fasnastic.com</link> 
    </IMAGE> 
    <itunes:category text="Comedy"/> 
    <ITEM> 
     <guid isPermaLink="false">tag:soundcloud,2010:tracks/291065752</guid> 
     <title>FAS - NAS - TIC</title> 
     <pubDate>Wed, 02 Nov 2016 03:00:52 +0000</pubDate> 
     <link>https://soundcloud.com/fasnastic/fas-nas-tic</link> 
     <itunes:duration>00:00:01</itunes:duration> 
     <itunes:author>FASNASTIC LTD.</itunes:author> 
     <itunes:explicit>yes</itunes:explicit> 
     <itunes:summary>The FASNASTIC LTD. Sonic Logo (created by Esa Juhani Ruoho)</itunes:summary> 
     <itunes:subtitle>The FASNASTIC LTD. Sonic Logo (created by Esa Juh…</itunes:subtitle> 
     <description>The FASNASTIC LTD. Sonic Logo (created by Esa Juhani Ruoho)</description> 
     <enclosure type="audio/mpeg" url="http://www.podtrac.com/pts/redirect.mp3/feeds.soundcloud.com/stream/291065752-fasnastic-fas-nas-tic.mp3" length="31805"/> 
     <itunes:image href="http://i1.sndcdn.com/artworks-000191668956-448wgw-original.jpg"/> 
    </ITEM> 
    </CHANNEL> 
</RSS> 

выход я получаю в настоящее время свыше XSLT (обратите внимание на недостающие атрибуты внутри <rss> - пространство имен атома и пространство имен iTunes исчезло, а верхний link тэг изменился с <atom:link href="http://feeds.soundcloud.com/users/soundcloud:users:245142600/sounds.rss?before=291065752" rel="next" type="application/rss+xml"/> на

<rss version="2.0"> 
    <channel> 
    <link xmlns="http://www.w3.org/2005/Atom" href="http://feeds.soundcloud.com/users/soundcloud:users:245142600/sounds.rss" rel="self" type="application/rss+xml"/> 
    <link xmlns="http://www.w3.org/2005/Atom" href="http://feeds.soundcloud.com/users/soundcloud:users:245142600/sounds.rss?before=291065752" rel="next" type="application/rss+xml"/> 
    <title>FASNASTIC: The Everything FASNASTIC Feed</title> 
    <link>http://fasnastic.com</link> 
    <pubdate>Thu, 03 Nov 2016 17:21:11 +0000</pubdate> 
    <lastbuilddate>Thu, 03 Nov 2016 17:21:11 +0000</lastbuilddate> 
    <ttl>60</ttl> 
    <language>en</language> 
    <copyright>All rights reserved</copyright> 
    <webmaster>[email protected] (SoundCloud Feeds)</webmaster> 
    <description>FASNASTIC LTD. is a UK things brand who make games and podcasts and things. 

Schedule.... 

THURSDAY: Game Fart Podcast - The FASNASTIC Farts &amp; Video Games Podcast. 
Farting out video game news for your pleasure. Please do not listen to this podcast if you treat video games even remotely seriously... 

FRIDAY: The Creepy Midnight Podcast - Do you like creepy shit? We do. This FASNASTIC LTD. podcast is designed to be listened to alone, at midnight. Conspiracy theories, science, diseases, technology and aliens. 

Download our apps and games on Android &amp; iOS. 
Find out more at http://fasnastic.com/</description> 
    <subtitle xmlns="http://www.itunes.com/dtds/podcast-1.0.dtd">FASNASTIC LTD. is a UK things brand who make game…</subtitle> 
    <owner xmlns="http://www.itunes.com/dtds/podcast-1.0.dtd"> 
     <name>FASNASTIC</name> 
     <email>[email protected]</email> 
    </owner> 
    <author xmlns="http://www.itunes.com/dtds/podcast-1.0.dtd">FASNASTIC LTD.</author> 
    <explicit xmlns="http://www.itunes.com/dtds/podcast-1.0.dtd">yes</explicit> 
    <image xmlns="http://www.itunes.com/dtds/podcast-1.0.dtd" href="http://i1.sndcdn.com/avatars-000274631751-z80y47-original.jpg"/> 
    <image> 
     <url>http://i1.sndcdn.com/avatars-000274631751-z80y47-original.jpg</url> 
     <title>FASNASTIC</title> 
     <link>http://fasnastic.com</link> 
    </image> 
    <category xmlns="http://www.itunes.com/dtds/podcast-1.0.dtd" text="Comedy"/> 
    <link/> 
    <item xmlns:default="http://www.itunes.com/dtds/podcast-1.0.dtd"> 
     <guid ispermalink="false">tag:soundcloud,2010:tracks/291065752</guid> 
     <title>FAS - NAS - TIC</title> 
     <pubdate>Wed, 02 Nov 2016 03:00:52 +0000</pubdate> 
     <link>https://soundcloud.com/fasnastic/fas-nas-tic</link> 
     <default:duration xmlns="http://www.itunes.com/dtds/podcast-1.0.dtd">00:00:01</default:duration> 
     <default:author xmlns="http://www.itunes.com/dtds/podcast-1.0.dtd">FASNASTIC LTD.</default:author> 
     <default:explicit xmlns="http://www.itunes.com/dtds/podcast-1.0.dtd">yes</default:explicit> 
     <default:summary xmlns="http://www.itunes.com/dtds/podcast-1.0.dtd">The FASNASTIC LTD. Sonic Logo (created by Esa Juhani Ruoho)</default:summary> 
     <default:subtitle xmlns="http://www.itunes.com/dtds/podcast-1.0.dtd">The FASNASTIC LTD. Sonic Logo (created by Esa Juh…</default:subtitle> 
     <description>The FASNASTIC LTD. Sonic Logo (created by Esa Juhani Ruoho)</description> 
     <enclosure type="audio/mpeg" url="http://www.podtrac.com/pts/redirect.mp3/feeds.soundcloud.com/stream/291065752-fasnastic-fas-nas-tic.mp3" length="31805"/> 
     <default:image xmlns="http://www.itunes.com/dtds/podcast-1.0.dtd" href="http://i1.sndcdn.com/artworks-000191668956-448wgw-original.jpg"/> 
    </item> 
    </channel> 
</rss> 

Желаемая выход (точно так же, как вход, только с <rss> вместо <RSS> и <channel> вместо <CHANNEL> и т.д. и т.п.)

<?xml version="1.0" encoding="UTF-8"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0"> 
    <channel> 
    <atom:link href="http://feeds.soundcloud.com/users/soundcloud:users:245142600/sounds.rss" rel="self" type="application/rss+xml"/> 
    <atom:link href="http://feeds.soundcloud.com/users/soundcloud:users:245142600/sounds.rss?before=291065752" rel="next" type="application/rss+xml"/> 
    <title>FASNASTIC: The Everything FASNASTIC Feed</title> 
    <link>http://fasnastic.com</link> 
    <pubDate>Thu, 03 Nov 2016 17:21:11 +0000</pubDate> 
    <lastBuildDate>Thu, 03 Nov 2016 17:21:11 +0000</lastBuildDate> 
    <ttl>60</ttl> 
    <language>en</language> 
    <copyright>All rights reserved</copyright> 
    <webMaster>[email protected] (SoundCloud Feeds)</webMaster> 
    <description>FASNASTIC LTD. is a UK things brand who make games and podcasts and things. 

Schedule.... 

THURSDAY: Game Fart Podcast - The FASNASTIC Farts &amp; Video Games Podcast. 
Farting out video game news for your pleasure. Please do not listen to this podcast if you treat video games even remotely seriously... 

FRIDAY: The Creepy Midnight Podcast - Do you like creepy shit? We do. This FASNASTIC LTD. podcast is designed to be listened to alone, at midnight. Conspiracy theories, science, diseases, technology and aliens. 

Download our apps and games on Android &amp; iOS. 
Find out more at http://fasnastic.com/</description> 
    <itunes:subtitle>FASNASTIC LTD. is a UK things brand who make game…</itunes:subtitle> 
    <itunes:owner> 
     <itunes:name>FASNASTIC</itunes:name> 
     <itunes:email>[email protected]</itunes:email> 
    </itunes:owner> 
    <itunes:author>FASNASTIC LTD.</itunes:author> 
    <itunes:explicit>yes</itunes:explicit> 
    <itunes:image href="http://i1.sndcdn.com/avatars-000274631751-z80y47-original.jpg"/> 
    <image> 
     <url>http://i1.sndcdn.com/avatars-000274631751-z80y47-original.jpg</url> 
     <title>FASNASTIC</title> 
     <link>http://fasnastic.com</link> 
    </image> 
    <itunes:category text="Comedy"/> 
    <item> 
     <guid isPermaLink="false">tag:soundcloud,2010:tracks/291065752</guid> 
     <title>FAS - NAS - TIC</title> 
     <pubDate>Wed, 02 Nov 2016 03:00:52 +0000</pubDate> 
     <link>https://soundcloud.com/fasnastic/fas-nas-tic</link> 
     <itunes:duration>00:00:01</itunes:duration> 
     <itunes:author>FASNASTIC LTD.</itunes:author> 
     <itunes:explicit>yes</itunes:explicit> 
     <itunes:summary>The FASNASTIC LTD. Sonic Logo (created by Esa Juhani Ruoho)</itunes:summary> 
     <itunes:subtitle>The FASNASTIC LTD. Sonic Logo (created by Esa Juh…</itunes:subtitle> 
     <description>The FASNASTIC LTD. Sonic Logo (created by Esa Juhani Ruoho)</description> 
     <enclosure type="audio/mpeg" url="http://www.podtrac.com/pts/redirect.mp3/feeds.soundcloud.com/stream/291065752-fasnastic-fas-nas-tic.mp3" length="31805"/> 
     <itunes:image href="http://i1.sndcdn.com/artworks-000191668956-448wgw-original.jpg"/> 
    </item> 
    </channel> 
</rss> 

Это время запуска с ниже PHP скрипт

$xmlLoaded = new DOMDocument; 
$xmlLoaded->preserveWhiteSpace = FALSE; 
$xmlLoaded->loadXML($stringContainingOriginalXML); 
//Load the style sheet inside an object 
$xslStylesheetObject= new DOMDocument(); 
//Create a processor 
$xslStylesheetProcessor = new XSLTProcessor(); 
$xslStylesheetProcessor->registerPHPFunctions(); 
//Import stylesheet into processor 
$xslStylesheetProcessor->importStylesheet($xslStylesheetObject); 
//Reload new XML after processing 
$xmlLoaded->loadXML($xslStylesheetProcessor->transformToXML($xmlLoaded)); 
+0

Зачем вам эти объявления пространства имен? Если они используются на выходе, они будут автоматически включены; в противном случае они являются избыточными, и никто не будет их пропускать (или, по крайней мере, никто не должен). –

+0

Hello michael.hor257k - спасибо за ответ! – mrmrw

+0

Эти пространства имен необходимы, чтобы сохранить корректный XML (для iTunes, RSS и т. Д.) --- ваш оригинальный XSLT удаляет все пространства имен из верхней части документа, поэтому он не проверяет правильность работы iTunes .... Есть ли способ чтобы сохранить все пространства имен в верхней части элемента RSS, как описано выше? – mrmrw

ответ

0

Это не тривиальная задача, и по уважительной причине. Причина заключается в том, что семантически нет никакой разницы между этими тремя:

<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"> 
    <itunes:owner> 

или:

<rss> 
    <owner xmlns="http://www.itunes.com/dtds/podcast-1.0.dtd"> 

или:

<rss> 
    <default:owner xmlns:default="http://www.itunes.com/dtds/podcast-1.0.dtd"> 

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

По той же причине любые меры, которые вы предпринимаете для обеспечения требуемого синтаксиса, могут работать с одним процессором, а не с другим.

Тем не менее, так как вы предположительно работает с libxslt процессором, я считаю, все, что вам нужно сделать, это добавить следующий шаблон:

<xsl:template match="RSS"> 
    <rss> 
     <xsl:copy-of select="namespace::*"/> 
     <xsl:apply-templates select="@*|node()"/> 
    </rss> 
</xsl:template> 
+0

Благодарим вас за быстрое образование на эту тему - хорошо знать, что все эти элементы на самом деле семантически одинаковы. Спасибо :) – mrmrw

+0

Я не мог заставить ваш последний код шаблона работать (я не был уверен, где его добавить? Это, похоже, не работало для меня ....), но я все еще отмечаю это правильно, как Я уверен, что это так, и ваше объяснение о том, как все эти три типа одинаковы, очень полезно. – mrmrw

Смежные вопросы