Использование встроенного XSLT для XML-файла
У меня есть 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 вместо этого? Возможно ли это? Если да, то как?
2 ответов
да, можно встроить XSLT внутри вашего XML.
XSLT является XML-файл, так что вы просто должны убедиться, что вы положили его внутри элемента документа XML-файла, так что XML-файл сформирован.
в самом деле это описано в спецификации XSLT:
2.7 Встраивание Таблиц Стилей
обычно таблица стилей XSLT полный XML-документ с язык xsl:элемент стилей как элемент документа. Однако в XSLT таблица стилей также может быть встроена в другой ресурс. Две формы встраивание возможно:
- таблица стилей XSLT может быть текстуально встроена в не XML ресурс, или
- элемент таблицы стилей xsl: может встречаться в XML-документе, отличном от как элемент документа.
для того чтобы облегчить вторую форму врезать, xsl: элемент таблицы стилей разрешено иметь атрибут ID, который указывает уникальный идентификатор.
Примечание: для того, чтобы такой атрибут использовался с идентификатором XPath функция, она должна быть фактически объявлена в DTD как ID.
в следующем примере показано, как обработка XML-таблицы стилей инструкция [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>
Примечание: таблица стилей, которая встроена в документ, к которому она должна применяется или может быть включен или импортирован в таблицу стилей, которая is so embedded обычно должен содержать правило шаблона, которое указывает, что элементы таблицы стилей xsl:должны игнорироваться.
в зависимости от того, как вы планируете использовать его, встроенные таблицы стилей могут не поддерживается. Например, в IE 6/7/8. есть некоторые обходные пути.
для тестирования на клиентских процессорах используйте self-referencing stylesheet:
<?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>