2011-01-16 3 views
22

Так что в настоящее время я выполняю работу XML-> XSLT-> (HTML5/CSS3). Прямо сейчас у меня есть файл menu.xml, и я хотел бы включить его в XSL-файл или XML-страницу. Я много раз искал, но я не могу найти прямой ответ.Включая файл XML в файл XML/XSL

Итак, как мне добавить XML-файл в другой файл XML или в XSL-файл?

Редактировать: Включить, я имею в виду ссылку/загрузку его из другого файла, а не копирование и вставка его или просто его вложение.

+0

Под «включать» это означает, что вы хотите скопировать/вставить содержимое menu.xml в другой файл и разместить его там без проблем, или вы имеете в виду, что хотите каким-то образом дистанционно ссылаться на меню. xml из файла хоста, или вы хотите, чтобы ваш веб-сервер копировал содержимое menu.xml в файл хоста перед его обслуживанием, как если бы вы сами скопировали или вставляли содержимое? – Phrogz

+0

Ах, я вроде как хотел ссылаться на него из файла, не включая его. Черт, мои разговоры говорят. Я слишком привык к C. – Jookia

+1

Хороший вопрос, +1. См. Мой ответ для объяснения и два полных примера кода, которые отвечают на ваши вопросы. :) –

ответ

33

I. Вот как любой документ XML или фрагмент может быть встроен в таблицу стилей XSLT и используется в процессе преобразования:

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

<my:menu> 
    <menu> 
    <choice>A</choice> 
    <choice>B</choice> 
    <choice>C</choice> 
    </menu> 
</my:menu> 

<xsl:template match="/"> 
    <xsl:copy-of select="document('')/*/my:menu/*"/> 
</xsl:template> 
</xsl:stylesheet> 

Когда это преобразование применяется на любой документ XML (не используется в этот пример), разыскиваемый результат (просто копирование XML) производится:

<menu xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="my:my"> 
    <choice>A</choice> 
    <choice>B</choice> 
    <choice>C</choice> 
</menu> 

Запомнить: Любой XM L может быть встроен в таблицу стилей XSLT, если она завернута в элемент с пространством имен (пространство имен, а не пространство имен XSLT), и этот элемент переноса находится на глобальном уровне (дочерний элемент <xsl:stylesheet> (верхний)).

II. Доступ к меню Файл XML, который находится в отдельном XML-файле:

Чтобы сделать это, мы должны изменить только немного предыдущий пример:

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


<xsl:template match="/"> 
    <xsl:copy-of select="document('menu.XML')/*"/> 
</xsl:template> 
</xsl:stylesheet> 

Если файл меню XML находится в файле 'menu.XML' (в том же каталоге, что и файл таблицы стилей XSLT, то это преобразование дает точно такой же результат как предыдущий:

<menu> 
    <choice>A</choice> 
    <choice>B</choice> 
    <choice>C</choice> 
</menu> 

ли нет т.е: В обоих случаях мы используем стандартную функцию XSLT document()

Как правило, один определяет переменную на глобальном уровне, значение которого является результатом вызова функции document(). Затем эту переменную и ее содержимое можно получить через выражения XPath во время преобразования.

+0

Возможно ли применять шаблоны на прилагаемом (menu.xml) документе, как и любой другой элемент? –

+3

@ lysergic-acid: Да, почему вы думаете, что это невозможно? Просто попробуйте '' или все, что вам нравится, чтобы увидеть, что это работает так, как предполагается. –

0

Если простое вложение файла внутри XML-файла не является решением, тогда добавление поля url, которое читает программа интерпретации, должно быть добавлено - вы в основном запрашиваете эквивалент include (menu.xml) или require (xml), но в файле XML.

Итак, поскольку вы пишете программу, в которой содержится intetretting, вы можете добавить тег <externalMenuTagThatYouDecideToAddToTheBaseXmlFile> или что бы вы ни назвали, что вы прочтете, и вставьте в корень примечание menu.xml место <externalMenuTagThatYouDecideToAddToTheBaseXmlFile>.

Удачи вам и ваши программы всегда скомпилируются.

+1

Я действительно не пишу переводчика, я пишу веб-сайт. > _> – Jookia

5

Итак, как мне добавить XML-файл в другой файл XML или в файл XSL?

Вы можете использовать external entity для ссылки на menu.xml файл и включить содержимое в любой файл XML или XSLT (или оба).

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

Используя внешние сущности, вы можете ссылаться/загрузить menu.xml контента из внешних файлов и не должны дублировать содержание XML.

Например, если вы хотели menu.xml содержание включенных в вашем XSLT, вы бы объявить внешний объект в вашем XSLT, как это:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE stylesheet [ 
    <!ENTITY menu SYSTEM "./menu.xml"> 
]> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

и может затем ссылаться на него, как и любой другой объект :

&menu; 

Когда XSLT разобран, ссылка объект будет расширен и содержание XML в menu.xml будет включен в качестве части XSLT документ, как если бы вы копировать/вставить в то место, где лица справка был.

+0

Это не плохой ответ, но это не «ссылка/загрузка» *, а замена синтаксиса поверхности реже, чем в логической абстракции. –

+1

упаковка &menu; в локальном объекте позволит использовать все xpath в меню xml в xslt. ex: &menu;, а затем sandeepkunkunuru

1

У меня есть a blog post на этом. Вы используете document() для получения другого XML и передачи содержимого с использованием параметров.

1

Мне не удалось получить код для работы, который предоставили люди. Однако я получил решение после нескольких попыток. Имя XML-файла clGroup.xml (первые две буквы не имеют значения, но я нахожу, что «Группа» требуется Этот файл XML будет ссылаться на XML, который вы хотите разобрать

clGroup XML:..

<?xml version='1.0' encoding="UTF-8" ?> 
<?xml-stylesheet type="text/xsl" href="calendarGroup.xslt" ?> 
<groups> 
    <groupRef>caGroup.xml</groupRef> 
</groups> 

Теперь имя файла caGroup.xml и поместить в следующий код:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<topics xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <topic> 
     <topicstopic>Calendar</topicstopic> 
     <topicsubmitter>Calendar</topicsubmitter> 
     <creatoremail>[email protected]</creatoremail> 
    </topic> 
    <topic> 
     <name>Week1</name> 
     <sunday/> 
     <monday/> 
     <tuesday>Test01 Young Men Weekly</tuesday> 
     <wednesday>02 Elders Home Teaching Message Birthday</wednesday> 
     <thursday>03 </thursday> 
     <friday>04 </friday> 
     <saturday>05 #Young Men Weekly</saturday> 
    </topic> 
    <topic> 
     <name>Week2</name> 
     <sunday>06 Fast Sunday</sunday> 
     <monday>07 FHE</monday> 
     <tuesday>08 Young Men Tonight #Young Men Weekly going to Bishops storehouse 6PM to 7PM Young Men Weekly</tuesday> 
     <wednesday>09 </wednesday> 
     <thursday>10 Scout Round Table at 7 PM </thursday> 
     <friday>11 </friday> 
     <saturday>12 </saturday> 
    </topic> 
    </topics> 

Теперь вот мой XSLT-файл calendarGroup.xslt

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

<xsl:output method="html" 
      version="1.0" 
      encoding="UTF-8" 
      indent="yes"/> 

<xsl:template match="groups/groupRef"> 
    <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
     <title>Table</title> 
     <meta charset="utf-8" /> 
    </head> 
    <body> 
     <table border="1"> 
     <tr> 
      <th>Sunday</th> 
      <th>Monday</th> 
      <th>Tuesday</th> 
      <th>Wednesday</th> 
      <th>Thursday</th> 
      <th>Friday</th> 
      <th>Saturday</th> 
     </tr>   
     <xsl:for-each select="document(.)//topic"> 
      <xsl:if test="string(name) != ''"> 
      <tr> 
      <td> 
       <xsl:value-of select="sunday"/> 
      </td> 
      <td> 
       <xsl:value-of select="monday"/> 
      </td> 
      <td> 
       <xsl:value-of select="tuesday"/> 
      </td> 
      <td> 
       <xsl:value-of select="wednesday"/> 
      </td> 
      <td> 
       <xsl:value-of select="thursday"/> 
      </td> 
      <td> 
       <xsl:value-of select="friday"/> 
      </td> 
      <td> 
       <xsl:value-of select="saturday"/> 
      </td> 
      </tr> 
      </xsl:if> 
     </xsl:for-each> 
     </table> 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

Преимущество настройки моего кода таким образом заключается в том, что я могу легко создать xml из файла excel, а не половину, чтобы вставить заявление во вновь созданный файл. Для этого вам нужно иметь формат «xxGroup», чтобы он работал вместе. Вы можете добавить больше групп в файл clGroup, и они будут анализировать в XSLT, позволяя вам добавить больше xml в тот же синтаксический анализатор XSLT. Убедитесь, что все они находятся в одном каталоге.

+0

В строке «Магия» нет магии "- вы можете использовать любые имена, которые вам нравятся. –

+0

Спасибо! Это странно, потому что, когда я меняю имена из формулировки, это не работает по какой-то причине для меня. Хорошая вещь, которую я вижу, - это добавить несколько XML-файлов в группу и проанализировать их. – Cody

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