Документ XSLT также является хорошо сформированным XML-документом. XSLT используется для преобразования XML-документов, и поэтому теоретически можно применить XSLT к себе.
Предположим, что ваш текущий XSLT выглядел как этот
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="xsl">
<xsl:output method="html" omit-xml-declaration="yes"/>
<xsl:template match="foo">
<h1><xsl:value-of select="@name" /></h1>
<xsl:apply-templates />
</xsl:template>
<xsl:template match="bar">
<h2><xsl:value-of select="@name" /></h2>
<xsl:apply-templates />
</xsl:template>
<xsl:template match="baz">
<p><xsl:value-of select="@name" /></p>
<xsl:apply-templates />
</xsl:template>
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates select="//foo" />
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Вместо того, чтобы встроить XSLT в ваш test.xml, вы можете вместо того, чтобы вставлять XML в XSLT, а затем сохранить его в виде файла XML. Один из способов сделать это создать фиктивное пространство имен, и ваш XML в качестве элемента в XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="my"
exclude-result-prefixes="xsl my">
<my:embeddedXML>
<foo name="1" b="2">
<bar name="11" b="22">
<baz name="111" b="222"/>
<baz name="112" b="223"/>
</bar>
</foo>
</my:embeddedXML>
Тогда вместо того, чтобы делать <xsl:apply-templates select="//foo" />
, замените его с этим
<xsl:apply-templates />
Но вы также потребуется шаблон игнорировать xsl:
элементы в «ввода» XML
<xsl:template match="xsl:stylesheet">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="xsl:*" />
Затем просто добавьте эту строку в верхней части его, и сохраните этот файл как Test.xml
:
<?xml-stylesheet type="text/xsl" href="Test.xml"?>
Таким образом, эффективно XML ссылается на себя, чтобы получить XSLT.
Попробуйте XML/XSLT:
Test.XML
<?xml-stylesheet type="text/xsl" href="Test.xml"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="xsl my" xmlns:my="my">
<xsl:output method="html" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*" />
<my:embeddedXML>
<foo name="1" b="2">
<bar name="11" b="22">
<baz name="111" b="222"/>
<baz name="112" b="223"/>
</bar>
</foo>
</my:embeddedXML>
<xsl:template match="foo">
<h1><xsl:value-of select="@name" /></h1>
<xsl:apply-templates />
</xsl:template>
<xsl:template match="bar">
<h2><xsl:value-of select="@name" /></h2>
<xsl:apply-templates />
</xsl:template>
<xsl:template match="baz">
<p><xsl:value-of select="@name" /></p>
<xsl:apply-templates />
</xsl:template>
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates />
</body>
</html>
</xsl:template>
<xsl:template match="xsl:stylesheet">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="xsl:*" />
</xsl:stylesheet>
Обратите внимание, что это XSLT может все еще быть применены к другим файлам XML, если требуется
Спасибо! обычно ли распространена практика встраивать xml внутри xsl, а не наоборот? – ljk
Честно говоря, это, вероятно, обычная практика не делать. В идеале вы сохраняете свой XSLT отдельно, чтобы его можно было легко применить к любому XML, а не привязать к определенному XML. Возможно, вы могли бы также применить преобразование самостоятельно, и вместо этого просто выполните результаты преобразования. –