2010-04-23 3 views
3

Описание - это уже существующий xml-файл. Мне было интересно, как я могу вставить элемент перед первым элементом, используя xslt?XSLT inserting off off custom text

<XmlFile> 
    <!-- insert another <tag> element here --> 
    <tag> 
     <innerTag> 
     </innerTag> 
    </tag> 
    <tag> 
     <innerTag> 
     </innerTag> 
    </tag> 
    <tag> 
     <innerTag> 
     </innerTag> 
    </tag> 
</XmlFile> 

Я имел в виду, используя для каждого-петлю и проверить положение = 0, а на первом наступлении для-каждого его уже слишком поздно. Это разовый текст, поэтому я не могу объединить его с другими шаблонами xslt, которые уже находятся в файле xsl.

Спасибо.

+0

+1 для хорошего вопроса. См. Мой ответ для очень короткого и простого решения. :) –

ответ

3

Вы должны знать и помнить одно самое важное: правило идентификации.

Вот очень простое и компактное решение с использованием наиболее фундаментальный шаблон проектирования XSLT: использование и отменяя правило идентичности:

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

<xsl:template match="node()|@*" name="identity"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="/*/*[1]"> 
    <someNewElement/> 
    <xsl:call-template name="identity"/> 
</xsl:template> 
</xsl:stylesheet> 

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

<XmlFile> 
    <!-- insert another <tag> element here --> 
    <someNewElement /> 
<tag> 
     <innerTag> 
     </innerTag> 
    </tag> 
    <tag> 
     <innerTag> 
     </innerTag> 
    </tag> 
    <tag> 
     <innerTag> 
     </innerTag> 
    </tag> 
</XmlFile>