2015-09-11 2 views
1

У меня есть файл test.xmlкак вставлять XSL в XML-файл

<?xml veresion="1.0 encoding="UTF-8"> 

<foo name="1" b="2"> 
    <bar name="11" b="22"> 
    <baz name="111" b="222"/> 
    <baz name="112" b="223"/> 
    ... 
    </bar> 
</foo> 

и XSLT-файл styles.xsl

<?xml version="1.0" encoding="utf-8"> 
<xsl:stylesheet version=1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
    <html> 
    <body> 
     <!--xslt--> 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

я могу получить на странице, чтобы правильно отобразить, добавив следующую строку, <?xml-stylesheet type="text/xsl" href="styles.xsl"?>, в test.xml. Теперь я пытаюсь объединить оба файла в один .xml-файл, который будет открыт более удобно. Я попытался сливая содержимое двух XML-документов, но это не сработало:

newtest.xml

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

    </html> 
</xsl:template> 
</xsl:stylesheet> 

После шагов на других SO нитей возвращается либо пустой или неформатированный страница

ли я пропустить что-нибудь?

ответ

2

Документ 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, если требуется

+0

Спасибо! обычно ли распространена практика встраивать xml внутри xsl, а не наоборот? – ljk

+0

Честно говоря, это, вероятно, обычная практика не делать. В идеале вы сохраняете свой XSLT отдельно, чтобы его можно было легко применить к любому XML, а не привязать к определенному XML. Возможно, вы могли бы также применить преобразование самостоятельно, и вместо этого просто выполните результаты преобразования. –

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