Реструктуризация XML с использованием xslt отображает только текст - PullRequest
0 голосов
/ 01 ноября 2011

У меня есть файл XML в качестве входных данных для файла XSL.Когда я указываю выходной метод xsl как xml и определяю элемент, используя xsl: element или сопоставляю элемент из xml, как сказано в других потоках, я не получаю никаких тегов. Я получаю только текст xml. У меня естьпробовал разные примеры.Что бы я ни пытался, я получаю только текстовую часть XML.Можете ли вы привести простой пример, содержащий полный рабочий код преобразования одного xml в другой xml с использованием xsl.

Извините, что не опубликовал пример.

Я попытался реструктурировать xml двумя способами:

1) Наличие файлов xsl и xml в одной папке и открытие xml с помощью браузера. Файл xsl применяется к xml, как показано ниже.

test.xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="sample.xsl"?>
<root>
<info>
    <firstname>Bob</firstname>
    <lastname>Joe</lastname>
</info>
<notes>
    <note>text1</note>
    <note>text2</note>
</notes>
<othernotes>
    <note>text3</note>
    <note>text4</note>
</othernotes>
</root>

sample.xsl

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="root">
   <root>
     <xsl:copy-of select="info"/>
     <notes>
        <xsl:copy-of select="othernotes"/>
     </notes>
   </root>
</xsl:template>
</xsl:stylesheet>

вывод: Боб Джо text3 text4

Обафайлы находятся в той же папке, и я открыл XML-файл, используя браузер, чтобы увидеть вывод.

2) В моем проекте используется Framework Struts с xslt.XML, установленный для представления, выглядит следующим образом. XML:

<root>
<data>
<array-list>
<array-list xsi:type="java:java.util.ArrayList">
<slot-info-object avail-crit-thresh="-1.0" avail-fif-min="-1.0" avail-five-min="-1.0" avail-one-day="0.0" avail-one-hr="-1.0" avail-warn-thresh="-1.0" freeslot="0" keyn-service-subtype-id="9" perf-crit-thresh="-1.0" perf-fif-min="-1.0" perf-five-min="-1.0" perf-one-day="0.0" perf-one-hr="-1.0" perf-warn-thresh="-1.0" severity-type="0" shared-script-id="-1" slot-id="671457" trans-id="733299" user-id="0" xsi:type="java:com.keynote.mykeynote.service.dashboard.SlotInfoObject">
<slot-alias>Single slot</slot-alias>
</slot-info-object>
<slot-info-object avail-crit-thresh="-1.0" avail-fif-min="1.0" avail-five-min="1.0" avail-one-day="1.0" avail-one-hr="1.0" avail-warn-thresh="-1.0" freeslot="0" keyn-service-subtype-id="9" perf-crit-thresh="-1.0" perf-fif-min="0.5105" perf-five-min="0.529" perf-one-day="0.6195208333333333" perf-one-hr="0.5505" perf-warn-thresh="-1.0" severity-type="0" shared-script-id="595" slot-id="685397" trans-id="-7105" user-id="0">
<slot-alias>SharedSlot</slot-alias>
</slot-info-object>
</array-list>
</array-list>
</data>
</root>

Представление - это xsl-файл, содержащий следующий код: XSL-файл:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" indent="yes"/>

<xsl:template match="/root/data/array-list/array-list">
<root>
<slot-info-object>
     <xsl:for-each select="slot-info-object">
     <xsl:copy-of select="slot-alias"/>     
     </xsl:for-each>
</slot-info-object>
</root>
</xsl:template>

</xsl:stylesheet>

вывод: Single slotSharedSlot

Еще один вопрос: request.setAttribute (StrutsCXConstants.XML_KEY, data);Здесь данные - это коллекция Java, такая как ArrayList.Эта строка записана в файле действий Struts. Она преобразуется только в XML для представления.Когда мы говорим это в xsl

<xsl:output method="xml" indent="yes"/>

, если тип ответа в классе Struts Action должен быть установлен на "text / xml"

Спасибо.

Ответы [ 4 ]

4 голосов
/ 01 ноября 2011

Скорее всего, это связано с тем, что ни одно из ваших правил шаблона не соответствует ничему в источнике, и есть вероятность, что это вызвано тем, что ваш XML находится в пространстве имен. Там - я отладил вашу таблицу стилей, не увидев ни единой строки кода, надеюсь, вы впечатлены. Подумайте, насколько проще было бы, если бы вы показали нам свой код.

0 голосов
/ 03 ноября 2011

В вашем XSL-коде нет шаблона для корневого узла "/", поэтому нет отправной точки для генерации вложенных тегов. Если вы измените элемент шаблона на

<xsl:template match="/root">

тогда вы увидите вывод.

0 голосов
/ 03 ноября 2011

Во втором случае я получил текст, потому что я не установил тип ответа xml в своем классе действий Java.Как только я установил это, xsl отображает мои собственные пользовательские теги и теги в xml, которые я отправил в xsl.

Что касается моего первого случая, как сказал Дмитрий Новатчев, мы должны использовать какую-то команду, подобную той, которая данапо следующей ссылке.http://www.biglist.com/lists/xsl-list/archives/199912/msg00082.html

Спасибо всем за информацию.

0 голосов
/ 02 ноября 2011

Объяснение :

То, что вы видите в браузере, это то, что браузер отображает, когда представлено не в формате HTML.

Решение :

Один из следующих вариантов:

  1. Сохранить вывод в файл (не используйте браузер для выполнения преобразования, а вызывайте его другим способом - скажем, изкомандной строки), а затем просмотрите этот файл в обычном текстовом редакторе.

  2. Добавьте в свой код XSLT элементы HTML, которые позволят браузеру отображать все, что вы хотите видеть.

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