#xml #xslt #escaping
#xml #xslt #экранирование
Вопрос:
У меня есть требование, в котором мне нужно удалить корневой узел и отобразить xslt на веб-странице в формате XML.
Чтобы сделать это более понятным, я напрямую предоставлю желаемый выходной XML-файл и входной XML, который я предоставляю.
Мой входной XML-файл:
<cp:gtl xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cp="urn:schemas-microsoft-com/contentpublishing/content" xmlns:ns1="http://www.w3.org/1999/xhtml" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2005-03-30T18:40:19" xmlns:xd="http://schemas.microsoft.com/office/infopath/2003" xml:lang="en-us">
<cp:abstract>
amp;<weatherdataamp;>amp;<weather entityid="32226" alert="" timezone="5.5" long="72.8195343" lat="21.195015" attribution2="© Foreca" attribution="Data provided by Foreca" provider="Foreca" degreetype="F" imagerelativeurl="http://stjp.msn.com/as/wea3/i/en-us/" url="http://local.msn.com/worldweather.aspx?eid=32226amp;amp;q=Surat-IND" encodedlocationname="Surat, IND" zipcode="" weatherlocationname="Surat, IND" weatherlocationcode="wc:INXX0157"amp;>amp;<current winddisplay="4 mph NE" windspeed="4" humidity="38" feelslike="90" observationpoint="Surat" observationtime="11:30:00" shortday="Wed" day="Wednesday" date="2011-11-09" skytext="Clear" skycode="32" temperature="90"/amp;>amp;<forecast shortday="Wed" day="Wednesday" date="2011-11-09" precip="5" skytextday="Clear" skycodeday="32" high="95" low="72"/amp;>amp;<forecast shortday="Thu" day="Thursday" date="2011-11-10" precip="5" skytextday="Clear" skycodeday="32" high="96" low="72"/amp;>amp;<forecast shortday="Fri" day="Friday" date="2011-11-11" precip="5" skytextday="Clear" skycodeday="32" high="96" low="72"/amp;>amp;<forecast shortday="Sat" day="Saturday" date="2011-11-12" precip="5" skytextday="Clear" skycodeday="32" high="95" low="75"/amp;>amp;<forecast shortday="Sun" day="Sunday" date="2011-11-13" precip="5" skytextday="Fair" skycodeday="34" high="96" low="79"/amp;>amp;<toolbar minversion="1.0.1965.0" timewindow="60"/amp;>amp;</weatheramp;>
amp;</weatherdataamp;>
</cp:abstract>
</cp:gtl>
И мой ожидаемый выходной файл на веб-странице:
<?xml version="1.0"?>
<weatherdata>
<weather entityid="32226" alert="" timezone="5.5" long="72.8195343" lat="21.195015" attribution2="© Foreca" attribution="Data provided by Foreca" provider="Foreca" degreetype="F" encodedlocationname="Surat, IND" zipcode="" weatherlocationname="Surat, IND" weatherlocationcode="wc:INXX0157"><current winddisplay="4 mph NE" windspeed="4" humidity="38" feelslike="90" observationpoint="Surat" observationtime="11:30:00" shortday="Wed" day="Wednesday" date="2011-11-09" skytext="Clear" skycode="32" temperature="90"/><forecast shortday="Wed" day="Wednesday" date="2011-11-09" precip="5" skytextday="Clear" skycodeday="32" high="95" low="72"/><forecast shortday="Thu" day="Thursday" date="2011-11-10" precip="5" skytextday="Clear" skycodeday="32" high="96" low="72"/><forecast shortday="Fri" day="Friday" date="2011-11-11" precip="5" skytextday="Clear" skycodeday="32" high="96" low="72"/><forecast shortday="Sat" day="Saturday" date="2011-11-12" precip="5" skytextday="Clear" skycodeday="32" high="95" low="75"/><forecast shortday="Sun" day="Sunday" date="2011-11-13" precip="5" skytextday="Fair" skycodeday="34" high="96" low="79"/><toolbar minversion="1.0.1965.0" timewindow="60"/></weather>
</weatherdata>
Однако в настоящее время происходит то, что я могу удалить тег cp: abstract, и мой XML отображается правильно на веб-странице, однако, когда я просматриваю исходный код страницы, я все еще вижу, что < и> заменено на > и <
Мой текущий xslt, который я написал, является:
<xslt:stylesheet version="1.0" exclude-result-prefixes="xslt cp gc" xmlns:xslt="http://www.w3.org/1999/XSL/Transform" xmlns:cp="urn:schemas-microsoft-com/contentpublishing/content" xmlns:gc="http://schemas.microsoft.com/msn/granite/cm"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:user="urn:my-scripts">
<xslt:output omit-xml-declaration="yes" method="xml"/>
<xslt:template match="gc:cm/gc:content/cp:root/cp:gtl">
<xslt:apply-templates select="cp:abstract"/>
</xslt:template>
<xslt:template match="cp:abstract">
<xslt:value-of select="." />
</xslt:template>
Может ли кто-нибудь, пожалуйста, помочь мне исправить мой xslt, чтобы я получал желаемый вывод XML?
Также обратите внимание, что XML под тегом cp:abstract генерируется случайным образом из feed. Иногда это для погоды, иногда какой-то другой динамический xml. Все, что я хочу, это корневой узел под тегом cp: abstract, который будет извлечен на моей веб-странице в формате XML.
Комментарии:
1. Правильно ли я понимаю, что вы хотите экранировать свой XML для отображения, независимо от того, какой XML у вас есть в качестве входных данных. То есть, вы хотите отобразить на веб-странице некоторый текст, который выглядит как введенный вами XML?
2. Да, вы абсолютно правы, например, я вижу этот URL weather.in.msn.com/data.aspx?wealocations=wc:INXX0157 . XML виден на этой странице. Если вы просматриваете исходный код страницы, я все равно вижу тот же XML без > и amp; < Я хочу сделать это с моим входным XML, указанным выше.
3. Итак, что не так с вашим текущим решением? Пожалуйста, отредактируйте вопрос и объясните.
Ответ №1:
Я думаю, вы хотите сказать, что когда вы просматриваете результирующий вывод в браузере, вы видите что-то вроде этого…
<weatherdata>
<weather entityid="32226" alert="" ....
</weatherdata>
Но когда вы выполняете ‘Просмотр исходного кода’, вы видите это
amp;<weatherdataamp;>
amp;<weather entityid="32226" alert=""
amp;</weatherdataamp;>
То есть, он был «экранирован» для целей отображения. Проблема в том, что ваш тег cp: abstract содержит строку текста, а не строку XML, и поэтому, поскольку вы выводите XML, процессор XSLT экранирует текст, чтобы потенциально не повлиять на основной XML-документ.
Решение состоит в том, чтобы сделать это, использовать disable-output-escaping для элемента xsl:value-of
<xslt:template match="cp:abstract">
<xslt:value-of select="." disable-output-escaping="yes" />
</xslt:template>
Когда это будет сделано, будет выведен следующий текст, который просто оказывается в формате XML
<weatherdata>
<weather entityid="32226" alert="" ....
</weatherdata>
В качестве альтернативы, вы могли бы изменить атрибут method в инструкции xsl:output на text, и это должно иметь тот же эффект
<xslt:output omit-xml-declaration="yes" method="text"/>