Использование встроенного XSLT для XML-файла

17

У меня есть XML-файл и внешний XSLT-файл.

В настоящее время в моем XML я ссылаюсь на внешнюю ссылку XSLT с помощью href:

 <?xml version="1.0" encoding="utf-8"?>
    <?xml-stylesheet type="text/xsl" href="stylesheet.xsl" ?>
     <mytag>
         <t1> </t1>
         <t2> </t2>
         <t3> <t3>
     <mytag>

Как я могу использовать встроенный XSLT? Это возможно? Если да, то как?

    
задан Akshay 20.08.2011 в 15:40
источник

2 ответа

10

Да, возможно встроить XSLT внутри вашего XML.

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

Фактически он описан в спецификации XSLT :

  

2.7 Вложение стилей

     

Обычно таблица стилей XSLT представляет собой полный XML-документ с   xsl: элемент stylesheet как элемент документа. Однако XSLT   таблица стилей также может быть встроена в другой ресурс. Две формы   возможно внедрение:

     
  • таблица стилей XSLT может быть встроена в текст без XML   ресурс или
  •   
  • Элемент xsl: stylesheet может встречаться в XML-документе, отличном от   как элемент документа.
  •   

Чтобы облегчить вторую форму вложения, элемент xsl: stylesheet   разрешено иметь атрибут идентификатора, который задает уникальный идентификатор.

     

ПРИМЕЧАНИЕ. . Чтобы этот атрибут использовался с идентификатором XPath   функции, он должен быть фактически объявлен в DTD как идентификатор.

     

В следующем примере показано, как обработка xml-stylesheet   команда [XML Stylesheet] может использоваться, чтобы позволить документу   содержат собственную таблицу стилей. Ссылка URI использует относительный URI с   идентификатор фрагмента, чтобы найти элемент xsl: stylesheet:

<?xml-stylesheet type="text/xml" href="#style1"?>
<!DOCTYPE doc SYSTEM "doc.dtd">
<doc>
<head>
<xsl:stylesheet id="style1"
                version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:import href="doc.xsl"/>
<xsl:template match="id('foo')">
  <fo:block font-weight="bold"><xsl:apply-templates/></fo:block>
</xsl:template>
<xsl:template match="xsl:stylesheet">
  <!-- ignore -->
</xsl:template>
</xsl:stylesheet>
</head>
<body>
<para id="foo">
...
</para>
</body>
</doc>
  

ПРИМЕЧАНИЕ. Таблица стилей, встроенная в документ, к которому она относится.   применяется или может быть включено или импортировано в таблицу стилей, которая   как правило, должно содержать правило шаблона, которое   указывает, что элементы xsl: stylesheet должны игнорироваться.

В зависимости от того, как вы планируете использовать его, встроенные таблицы стилей могут не поддерживаться. Например, в IE 6/7/8. Там некоторые способы обхода .

    
ответ дан Mads Hansen 20.08.2011 в 16:35
0

Для тестирования на клиентских процессорах используйте таблицу саморегуляции стилей :

<?xml version="1.0" encoding="utf-8"?>
<!--Reference the file name as the href value-->
<?xml-stylesheet type="text/xsl" href="html5.xml"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"
                >

<!-- Output HTML doctype with text/html content-type and without XML declaration-->
<xsl:output method="xml" encoding="utf-8" version="" indent="yes" standalone="no" media-type="text/html" omit-xml-declaration="yes" doctype-system="about:legacy-compat" />


<!-- Read the children of the stylesheet itself -->
<xsl:template match="xsl:stylesheet">
  <xsl:apply-templates/>
</xsl:template>

<!-- Output the HTML markup-->
<xsl:template match="/">
  <html>
    <head>
      <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
      <link rel="stylesheet" type="text/css" href="foo.css"/>
    </head>
    <body>
      <div class="foo">
        <span class="bar">
           <span class="baz">1</span>
        </span>
        <!--Added comment to fill empty node-->
        <span class="placeholder"><xsl:comment/></span>
      </div>

      <!-- Read matching templates -->
      <xsl:apply-templates />
        <!--Add comment to fill empty script tag-->
        <script src="foo.js" type="application/x-javascript"><xsl:comment/></script>
    </body>
  </html>
</xsl:template>

<!-- Don't reprint text nodes within the xsl:stylesheet node -->
<xsl:template match="text()"/>

<!-- Read non-namespaced nodes within the xsl:stylesheet node -->
<xsl:template match="//node()[local-name() = name()]">
  <xsl:if test="local-name() = 'foo'">
    <xsl:variable name="foo" select="."/>

    <input type="text" id="{$foo}" value="{$foo}"></input>
  </xsl:if>
  <xsl:apply-templates/>
</xsl:template>

<test>
 <foo>A</foo> 
 <foo>B</foo> 
 <foo>C</foo>
</test>

</xsl:stylesheet> 
    
ответ дан Paul Sweatte 04.04.2013 в 20:40